public class Knapsack {// 0/1背包算法,填表x,f,找最大价值public static void knapSack(int c, int n, int x[], int w[], int v[], int f[][]){// 填表f[][],第0行,第0列为0 ,即f[i][0] = f[0][j] = 0for (int i=0; i<=n; i++)f[i][0] = 0;for (int j=0; j<=c; j++)f[0][j] = 0;// 填表f[][],其他位置 f[i][j] = 核心公式// 表f 的意义是记录 背包容量从0到c 时的每个容量时的背包能有的最大价值for (int i=1; i<=n; i++) {    // 依次计算第i行,第0行已经填完,从 1 开始for (int j=1; j<=c; j++){ // 依次计算第i行每个元素,第0列已经填完,从 1 开始if (w[i] > j)// 如果 第i个物品的重量>背包当前容量 ,即第i个物品不可装f[i][j] = f[i-1][j];    // 最大价值量不变else         // 如果 第i个物品可装入,比较一下是装入价值大,还是不装入价值大f[i][j] = Math.max(f[i-1][j], v[i] + f[i-1][j-w[i]]);
/* 此处,我原来有个错误认识,可以装,可以不装,那肯定装了价值大啊,原来的理解错在哪,原来的理解是基于装进背包的物品就不再拿出来了,那肯定是越装越多,但是v[i] + f[i-1][j-w[i]] 的意思是 当前此物品的价值+(当前背包容量-此物品重量)时的最大物品价值(此种情况下可能会造成原来装入的物品已经被拿出来了)这个核心公式正是表达了 最优子结构性质:一个问题的最优解 包含了 子问题的最优解
*/}}// 打印 f 表的值System.out.println("表 f 的值:");for (int i=0; i<=n; i++){for (int j=0; j<=c; j++)System.out.printf("%-4d" , f[i][j]);System.out.println();}// 填表 x[i],计算总价值int j = c;for (int i=n; i>0; i--) {if (f[i][j] > f[i-1][j]) {    // 如果 第i个物品装入x[i] = 1;    // x[i] 置1j -= w[i];   // 背包重量减去 w[i]}else    // 如果 第i个物品不装入x[i] = 0;    // x[i] 置0,背包重量不变}// 打印 x 表的值 和 总价值System.out.println("表 x 的值:");for (int i=1; i<=n; i++)System.out.print("x" + i + " = " + x[i] + "\t");System.out.println();System.out.printf("总价值为: %d", f[n][c]);}public static void main(String[] args) {int c = 10;     // 背包总重量为 10int n = 5;      // 总的物品数为 5int x[] = new int[n+1]; // 是否装入 xi,即 xi = 1/0  (x[0]]位置不用)int w[] = new int[]{0,2,2,6,5,4};// xi 的重量 (w[0]位置不用)int v[] = new int[]{0,6,3,5,4,6};// xi 的价值 (v[0]位置不用)int f[][] = new int[n+1][c+1];   // f[i][j] 前i个物品装入容量为j的包 所得到的最大价值knapSack(c, n, x, w, v, f); // 调用0/1背包算法,填表x,f,找最大价值}
}

01背包问题 动态规划 java(详细注释)相关推荐

  1. 01背包问题 动态规划 java实现 简单通俗易懂

    ** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...

  2. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  3. 01背包问题动态规划(二维数组)

    01背包问题动态规划(二维数组) 问题描述 ​ 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn,求旅行者能获得 ...

  4. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  5. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  6. 01背包问题 动态规划求解方法 动态方程的详细解释 能理解的解释(附python代码)

    01背包问题属于组合优化问题:假设你要出门旅游,你现在有一个书包,这个书包的容量(capacity)有限,有很多物品如牙刷.防晒霜.雨伞.水杯等等,但书包装不下所有物品,因此我们必须有所取舍.那么通常 ...

  7. 【转】01背包问题动态规划详解

    转载自 sunstar1989 最终编辑 中华复生母 动态规划是用空间换时间的一种方法的抽象.其关键是发现子问题和记录其结果.然后利用这些结果减轻运算量. 比如01背包问题. 因为背包最大容量M未知. ...

  8. 0-1背包问题 动态规划c语言,详解动态规划01背包问题--JavaScript实现

    一开始在接触动态规划的时候,可能会云里雾里,似乎能理解思路,但是又无法准确地表述或者把代码写出来.本篇将一步一步通过作图的方式帮助初次接触动态规划的同学来理解问题.这一篇将以经典的 01背包 问题为例 ...

  9. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

最新文章

  1. java python算法_用Python,Java和C ++示例解释的排序算法
  2. 机器学习的大局:用神经网络和TensorFlow分类文本
  3. 一个流畅的iOS图表框架PNChart
  4. js获取本月第几周和本年第几周
  5. python文件处理seek()方法的参数是,在Python中操作文件之seek()方法的使用教程
  6. 使用k8s Ingress暴露gRPC服务
  7. 计算机实训学校目的和要求,计算机实习目的和要求
  8. python单例模式例子_python单例模式实例分析
  9. Linux使用PulseAudio设置音频card的默认profile
  10. 自行委托的鉴定意见可以作为审理依据
  11. Cents7 查看当前版本
  12. html向下的箭头符号怎么打,向下的箭头怎么打
  13. 使用Frida hook 获取native层代码的返回值
  14. 华为高管丁耘跑28公里后突发疾病去世:在公司工作26年
  15. 深度学习 卷积神经网络-Pytorch手写数字识别
  16. 探索 Zynq MPSoC:配套 PYNQ 和机器学习应用一起使用 - 序言鸣谢目录20211231
  17. 蓝桥杯 动态数码管中的延时处理
  18. linux远程端口查看
  19. 2015年职称计算机考试宝典,2015年度职称计算机考试宝典.doc
  20. 2021秋冬上海时装周开启,聚焦8大国内外品牌

热门文章

  1. Xmind 8 pro 软件破解教程
  2. 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.3版已发布
  3. mysql数据库常见问题及解决办法
  4. windows 系统验证是否为正版
  5. 微软OEM序列号探究
  6. 开博尔智能android播放器C3,开博尔C3四核最新固件Android4.4_KIUI7.0_v1.0.4
  7. android 忽略wifi密码,android 连接指定SSID 的无密码Wifi ,连接不上
  8. true false 与TRUE FALSE 的区别
  9. qt窗口置顶linux环境下,Qt 实现窗口置顶与取消置顶
  10. C# 进程管理 Process的常用属性与方法