0-1背包详细解释加代码注释
2017-03-04 15:52
295 查看
来源自我的博客
http://www.yingzinanfei.com/2017/03/04/0-1beibaoxiangxijieshijiadaimazhushi/
那么在处理第i个物品时有两个选择,放入背包和不放入背包
如果第i个物品不放入背包,那么
如果第i个物品放入了背包,那么要从i+1层来获得数据的话,肯定是从第i+1,i+2,…,n个物品装到容量为j-V[i]获得。因为第i个物品放入了背包,下一层时容量变小了
d(i+1, j-V[i])
因为d(i, j)表示的含义是背包中的最大重量,因为第i个物品放入了背包,所以重量有增加,最后的表达式为
这两种情况都有可能,那么就取最大值吧
因为第i层数据从第i+1层来,所以对i的循环要逆序,从大到小
第n层的数据d(n, j)表示把第n个物品装到容量为j的背包中的最大重量,没有第n+1层了,所以直接判断此边界
如果能放进且放进去的话,
如果不能放进或不想放进的话,
如果要合并边界和一般情况,可以加一个n + 1层,使其全部初始化为0
http://www.yingzinanfei.com/2017/03/04/0-1beibaoxiangxijieshijiadaimazhushi/
问题:
有n种物品,每种只有一个。第i种物品的体积为Vi,重量为Wi。选一些物品装到一个容量为C的背包,使得背包内物品在总体积不超过C的前提下重量尽量大。1 <= n <= 100 1 <= Vi <= C <= 10000 1 <= Wi <= 1000000
方法:
题目为求把第1,2,3,…,n个物品装到容量为C的背包中的最大重量,那么设d(i,j)表示把第i,i+1,i+2,…,n个物品装到容量为j的背包中的最大重量。答案为d(1,C)。那么在处理第i个物品时有两个选择,放入背包和不放入背包
如果第i个物品不放入背包,那么
d(i, j) = d(i + 1, j),表示这和把第i+1,i+2,…,n个物品装到容量为j的背包中的最大重量一样
如果第i个物品放入了背包,那么要从i+1层来获得数据的话,肯定是从第i+1,i+2,…,n个物品装到容量为j-V[i]获得。因为第i个物品放入了背包,下一层时容量变小了
d(i+1, j-V[i])
因为d(i, j)表示的含义是背包中的最大重量,因为第i个物品放入了背包,所以重量有增加,最后的表达式为
d(i, j) = d(i + 1, j - V[i]) + W[i]
这两种情况都有可能,那么就取最大值吧
d(i, j) = max{d(i + 1, j), d(i + 1, j - V[i]) + W[i]}
因为第i层数据从第i+1层来,所以对i的循环要逆序,从大到小
第n层的数据d(n, j)表示把第n个物品装到容量为j的背包中的最大重量,没有第n+1层了,所以直接判断此边界
如果能放进且放进去的话,
d(n, j) = V
如果不能放进或不想放进的话,
d(n, j) = 0
代码
for (int j = 0; j <= C; j++){ // 处理第n层的边界情况 if (j >= V ){ // 如果能放进去那肯定选择放进去 d [j] = W ; } else{ // 不能放进去就为0 d [j] = 0; } } for (int i = n - 1; i >= 1; i--){ // n要逆序,从第n-1层开始 for (int j = 0; j <= C; j++){ // j的循环次序无所谓 d[i][j] = d[i + 1][j]; // 先假设不放进去 if (j >= V[i]){ // 如果能放进去且放进去的话 d[i][j] = max(d[i][j], d[i + 1][j - V[i]] + W[i]); } } }
如果要合并边界和一般情况,可以加一个n + 1层,使其全部初始化为0
memset(d, 0, sizeof(d)); for (int i = n; i >= 1; i--){ // 从第n层开始 for (int j = 0; j <= C; j++){ d[i][j] = d[i + 1][j]; // 先假设不放进去 if (j >= V[i]){ d[i][j] = max(d[i][j], d[i + 1][j - V[i]] + W[i]); } } }
相关文章推荐
- Prototype 1.4.0源码详细解释--脚本代码全文注释
- 归并排序c++代码及详细注释
- 谁能帮我详细解释一下这段代码?
- 分页机制代码详细注释
- jquery 多行滚动代码(附详细解释)
- PHP 缓存实现代码及详细注释
- 菜鸟之[C#WinForm传值(方法一)(详细代码及注释)]
- 0/1 背包问题解释及代码
- 传智博客佟老师jqurey学习笔记,以及例子代码详细注释。
- 背包0-1问题不详细解释
- 初尝Linq,代码贴出来,有详细的注释
- 带详细解释的冲击波原代码
- ASP.Net 2.0 窗体身份验证机制-转+自己代码注释示例与更详细的说明
- ASP.Net 2.0 窗体身份验证机制-转+自己代码注释示例与更详细的说明(网上转)
- C/C++实现如下 根据Merge Sort原理, 自己实现的归并排序算法+详细注释+代码(C#,C/C++)
- 根据Merge Sort原理, 自己实现的归并排序算法+详细注释+代码(C#,C/C++) [分享]
- 带详细解释的冲击波原代码)
- IIS6/IIS7 状态代码:IIS详细错误代码以及解释
- PHP 图片上传实现代码 带详细注释
- IIS7.0出错的解决方案 IIS 状态代码:IIS详细错误代码以及解释