0-1背包问题动态规划详解
来源:互联网 发布:webservice添加数据 编辑:程序博客网 时间:2024/06/06 03:35
参考:
1.小白请看视频理清楚概念再往下看:【经典算法】01背包问题—在线播放—优酷网,视频高清在线观看
2.不想看视频可以看这篇博客:0-1背包问题动态规划详解 - 张三的哥哥 - 博客园
3.0019算法笔记——【动态规划】0-1背包问题 - liufeng_king的专栏 - 博客频道 - CSDN.NET
背包问题:
背包装10斤物品,有3件物品,重量分别是3斤,4斤,5斤,价值分别是4,5,6;
可以画一个矩阵,
1.行号0,1,2,3,行号0表示0件物品可放入背包情况下,背包装载最大价值,行号1表示只有第一件物品可以放入背包情况下,背包装载最大价值,行号2表示只有第1件和第2件可以放入背包情况下,背包装载最大价值,……
2.列号0,1,2,3………….10表示背包剩余可用容量,列号0表示背包已满时候,剩余容量为0时候,还可以装载的最大价值;列号1表示背包剩余容量为1时候,还可以装载的最大价值,……
当行号是3,列号是10时候,价值最大,即c[3][10]值最大.
public class Knapsack { private final int MIN = Integer.MIN_VALUE; public static void main(String[] args) { int[] w = {3, 2, 2}; int[] v = {5, 10, 20}; knapsackOptimal(5, w, v); } /** * 01背包-容量压缩 * * @param c 包容量 * @param weight 各物品质量 * @param value 各物品价值 */ public static void knapsackOptimal(int c, int[] weight, int[] value) { int n = weight.length; //物品数量 int[] w = new int[n + 1]; int[] v = new int[n + 1]; int[][] G = new int[n + 1][c + 1]; for (int i = 1; i < n + 1; i++) { w[i] = weight[i - 1]; v[i] = value[i - 1]; } //初始化values[0...c]=0————在不超过背包容量的情况下,最多能获得多少价值 //原因:如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0, // 所以初始时状态的值也就全部为0了 int[] values = new int[c + 1]; //初始化values[0]=0,其它全为负无穷————解决在恰好装满背包的情况下,最多能获得多少价值的问题 //原因:只有容量为0的背包可以什么物品都不装就能装满,此时价值为0,其它容量背包均无合法的解, // 属于未定义的状态,应该被赋值为负无穷 /*for (int i = 1; i < values.length; i++) { values[i] = MIN; }*/ for (int i = 1; i < n + 1; i++) { for (int t = c; t >= w[i]; t--) { if (values[t] < values[t - w[i]] + v[i]) { values[t] = values[t - w[i]] + v[i]; G[i][t] = 1; } } } System.out.println("最大价值为: " + values[c]); System.out.print("装入背包的物品编号为: "); /* 输出顺序:逆序输出物品编号 注意:这里另外开辟数组G[i][v],标记上一个状态的位置 G[i][v] = 1:表示物品i放入背包了,上一状态为G[i - 1][v - w[i]] G[i][v] = 0:表示物品i没有放入背包,上一状态为G[i - 1][v] */ int i = n; int j = c; while (i > 0) { if (G[i][j] == 1) { System.out.print(i + " "); j -= w[i]; } i--; } }}
运行结果:
————-我是低调的分割线————————–
如果对你有帮助,可以点击“点赞”哦`(*∩_∩*)′
本文转载声明:
1.本文内容转于:0-1背包问题动态规划详解 - 张三的哥哥 - 博客园
2.本文代码转载于:01背包问题(Java实现) - 小白水 - 博客园
阅读全文
0 0
- 0/1背包问题动态规划详解
- 0/1背包问题动态规划详解
- 0/1背包问题动态规划详解
- 0/1背包问题动态规划详解
- 0/1背包问题动态规划详解
- 0-1背包问题动态规划详解
- 0/1背包问题动态规划详解之一
- 动态规划法解决0/1背包问题详解
- 背包问题动态规划详解
- 动态规划之0-1背包详解
- 动态规划之0-1背包详解
- 动态规划解0-1背包问题
- 动态规划 ------0-1背包问题
- 动态规划解决0-1背包问题
- 0-1背包问题--动态规划解法
- 动态规划解0-1背包问题
- 0-1背包问题动态规划
- 0-1背包问题,动态规划求解
- Unity Shader中的坐标系转换
- angular.js自学模式
- IAR报错could not find the following source file
- spring事务实用开发
- awk 求和、最大、最小、平均值
- 0-1背包问题动态规划详解
- [51nod1190]最小公倍数之和V2
- openCV学习系列1:我为什么要学习openCV,什么是openCV
- 【TensorFlow】tf.concat
- NOIP 2009 Senior 3
- U3D中在Grid中增加和修改Cell的部分代码
- hdu2068错排+排列组合
- python笔记3_集合与字典
- 机器学习与深度学习(三) 支持向量机 (Support Vector Machine) SVM