01背包详解
来源:互联网 发布:c语言三角形判断 编辑:程序博客网 时间:2024/06/13 11:47
01背包
看了2天的01背包,感觉现在真的是懂了,记录一下,这样才能记得更加深刻,其实早就接触过01背包,当时一知半解的,今天看了书本和别人的博客,真的很有用:
1、 描述一下01背包问题
有n个重量和价值分别为wi,vi,的物品,从这些物品中挑选出总重量不超过W的物品,求所有的挑选方案中价值总和的最大值。(这里需要注意的问题每一件物品只有一件)。
2、 其实对于每一个物品我们有2种选择,那就是选择与不选择;所以我们可以按照DFS对每一种情况进行搜索,这样也是可以求出最后的结果(不知道是不是所有的dp问题都可以用递归的来解答,有待学习)
3、 下面主要是对dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
进行讲解,dp【i】【j】描述的什么意思?当背包的承重为j时,选择的物品有1-i,能够得到的最大值(这里需要重点理解,一定要好好琢磨一下)。
4、 下面就是代码:(我们看着代码进行分析)
for(i=1;i<=n;++i){for(j=0;j<=w;++j){ if(j<w[i])dp[i][j]=dp[i-1][j];else dp[i][j]=get_max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } }
看着代码我们会发现,其实是一种递推关系dp【i】【j】,对于j的值,0-W,对每一个j的值我们求出最大值,当然这是在i-1的基础上求解的,就是这样一直递推下去;其实画一个二维表就很清楚了,如下:
n=4,W=5,(2,3),(1,2),(3,4),(2,2);以这个为例子进行画表
这是按照代码填写的二维表,其实填了几行你就会发现,i从1-4,每加入一个物品,都要从i-1个物品中j从0-5去一一计算加入i物品的最大值,当然j的值也是从小到大0-5;
每次加入一个物品都保证了j(0-5)的值中的最大值,也就是最优解,(可能表达的不好,具体自己画一下二维表,强烈建议画二维表),这个代码还可以推广到一维的形式,具体我会慢慢的讲解。
- 01背包、完全背包、多重背包详解
- 01背包,完全背包,多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解 Acm
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解(转)
- 背包之01背包、完全背包、多重背包详解
- 背包之01背包、完全背包、多重背包详解
- 关于typeof 、instanceof 、constructor的用法
- SpringMvc @requestparam 中文乱码问题解决方案
- 【算法学习】剑指offer问题2——单例模式
- SCRUM:敏捷团队的故事(SCRUM: The Story of an Agile Team)——(2)
- 报错:Ambiguous mapping
- 01背包详解
- Java 学习笔记 Day012(续)
- SAP中使用MM01创建物料如何选定行业领域和物料类型
- Bootstrap—使用按钮组
- Hbase葱岭探秘--JavaApi实践
- 广义霍夫变换目标匹配
- 回归算法应用场景实例二十则
- docker命令
- [pku1743]不可重叠最长重复子串