首页 > 编程语言 >Java编程:动态规划

Java编程:动态规划

时间:2024-06-16 21:28:30浏览次数:25  
标签:背包 Java 容量 int 编程 装入 物品 动态

背包问题:有一个背包,容量为4磅 , 现有如下物品

在这里插入图片描述

  1. 要求达到的目标为装入的背包的总价值最大,并且重量不超出

  2. 要求装入的物品不能重复

动态规划算法介绍

===================================================================

  1. 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法

  2. 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

  3. 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )

  4. 动态规划可以通过填表的方式来逐步推进,得到最优解.

思路分析和图解

==================================================================

  1. 背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分01背包和完全背包(完全背包指的是:每种物品都有无限件可用)

  2. 这里的问题属于01背包,即每个物品最多放一个。而无限背包可以转化为01背包。

  3. 算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,C为背包的容量。再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。则我们有下面的结果:

(1) v[i][0]=v[0][j]=0; //表示 填入表 第一行和第一列是0

(2) 当w[i]> j 时:v[i][j]=v[i-1][j] // 当准备加入新增的商品的容量大于 当前背包的容量时,就直接使用上一个单元格的装入策略

(3) 当j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]}

// 当 准备加入的新增的商品的容量小于等于当前背包的容量,

// 装入的方式:

**v[i-1][j]: 就是上一个单元格的装入的最大值

v[i] : 表示当前商品的价值

v[i-1][j-w[i]] : 装入i-1商品,到剩余空间j-w[i]的最大值

当j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]}

标签:背包,Java,容量,int,编程,装入,物品,动态
From: https://blog.csdn.net/2401_85111595/article/details/139726314

相关文章

  • 2024年Java后端开发学习路线(建议收藏!)
    第二部分:Java高级在Java高级中,我们应该要熟练掌握。Java多线程/高并发,数据结构和算法,设计模式和JVM。第三部分:JavaWEB学习JavaWeb也就算正式开始了Java项目的开发,在这个阶段需要掌握Tomcat服务器的搭建,数据的传输。第四部分:主流框架和项目管理在这个阶段,我们需要......
  • java学习03
    类型转换强制类型转换自动类型转化自动类型转换会从低到高转换类型转换注意点1、不能进行布尔类型的转换2、转化时会有精度和溢出的问题变量java变量类型名称值typevarName[=value]局部变量在方法里面实例变量在方法外在类里面类变量带static时可直接在方法里使......
  • 【JavaScript脚本宇宙】提升Markdown工作流:不可错过的六个JavaScript库
    优化你的Markdown体验:六大JavaScript库一网打尽前言在现代Web开发中,Markdown作为一种轻量级的标记语言,凭借其简洁易读的语法和广泛的适用性,迅速成为开发者们的宠儿。为了更有效地解析和处理Markdown内容,JavaScript社区涌现了许多功能强大的库。这些库不仅能够高效地将Mark......
  • 面向储存的源码级轻量预处理编程
    以下是对它的定义面向储存的源码级轻量预处理编程是一种在算法竞赛(competitiveprogramming)中常用技巧(skill),它是一种基于预处理的思想而演变出来的编程方法。要采用这种方法,首先可以把整个程序分为两部分:生成器(genernater)结果程序(result)我们通常使用生成器把一......
  • 【JavaEE精炼宝库】多线程(6)线程池
    目录一、线程池的概念及优势1.1线程池的概念:1.2线程池的优势:二、工厂模式三、标准库中的线程池3.1标准库线程池参数解释:3.1.1corePoolSize|maximumPoolSize:3.1.2keepAliveTime|unit:3.1.3workQueue: 3.1.4ThreadFactory: 3.1.5handler:3.2创建线程池演......
  • cjavapy编程书籍推荐
    cjavapy编程书店主要是收集了C/C++/C#、Java、Python等语言编程基础教程书籍,以及高级进阶教程书籍,还有其它编程相关的Linux、机器学习、编程提高及面试提高方面的书籍。1、cjavapy编程书店简介cjavapy编程书店主要收录编程相关的经典书籍,书籍的购买方式都是在抖音橱窗,书店只......
  • JAVA 实用类
    1.什么是枚举类?访问修饰符Enum枚举名称{}其应用上可以看做一个类去定义,如果枚举里有方法,定义的枚举常量要以':'结尾2.应用枚举的好处?枚举限制了范围,更加安全,如果要大量定义常量用publicfinalstaticA=1;定义起来太复杂,用枚举简单多,代码简洁publicvoidday(Day(枚举类型)......
  • [转]32th@深入解析C++并发编程:从多线程到现代C++并发库@20240616
    深入解析C++并发编程:从多线程到现代C++并发库你有没有想过,为什么C++在多线程并发编程方面如此强大?C++11标准的发布,为并发编程带来了哪些革命性的变化?本文将深入探讨C++并发编程背后的技术原理,带你领略现代C++并发库的强大之处。文章将结合代码片段,为你揭示C++并发编程的精髓。1.......
  • [转]32th@探索C++的模板元编程:揭秘零运行时开销的高性能编程技术@20240616
    C++的模板元编程是一种强大的编程技术,它能够在编译时进行计算,生成高效的代码,而且不需要任何运行时开销。这种技术被广泛应用于高性能计算、游戏开发、金融等领域,是C++程序员必须掌握的技能之一。本文将深入探讨C++模板元编程的原理和实现方式,并通过代码案例来展示其强大的功能。相......
  • 第01章:随堂复习与企业真题(Java语言概述)
    第01章:随堂复习与企业真题(Java语言概述)一、随堂复习1.Java基础全程的学习内容第1阶段:Java基本语法>Java概述、关键字、标识符、变量、运算符、流程控制(条件判断、选择结构、循环结构)、IDEA、数组第2阶段:Java面向对象编程>类及类的内部成员>面向对象的三大特征......