关于背包问题的研究
2017-08-07 21:28
176 查看
背包问题
1. 0-1背包
我们先从经典的0-1背包谈起,显然这是一个动态规划。这个过程”商量“的问题是遇到一个物品到底放还是不放呢?(每种物品仅有一件,可以选择放或不放。)它的商量方程就是:m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i])————其中m[i][j]表示还有i个物品供选择,背包容量为j。
AC代码:
二维dp: for(i=1;i<=n;++i) //i表示物品i; { for(j=0;j<=c;++j)//j表示背包容量; { if(j<w[i]) dp[i][j]=dp[i-1][j]; else dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } } //这本质上就是一个由上到下,由左到右的填表过程; 一维dp: for(i = 0;i<n;i++) { for(j = v;j>=w[i];j--)//01背包 { dp[j] = max(dp[j],dp[j-w[i]]+v[i]); //dp[j]表示j容量下背包的最大价值; } }
2. 完全背包
要先知道完全背包和01背包的区别,01背包n个物品,每一个物品有1个,而完全背包每一件物品有无数个,只要求求出在不大于W的情况下求出最大的值;(也就是说它可以继续选择同一件物品,不一定要换成别的物品)故它的商量方程和01背包的只有一点点差别,就是是继续选该物品还是选下一件。
代码:
二维dp: 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][j-w[i]]+p[i]); } } 一维dp: for(i=1;i<=n;++i) { for(j=w[i];j<=W;++j) dp[j]=max(dp[j],dp[j-w[i]]+p[i]); }
背包问题还有各种变式,需要大家仔细琢磨。这里就不一一讲述了。
相关文章推荐
- 关于背包问题的进一步优化
- 关于系统休眠问题的研究
- 关于拟物化和扁平化的讨论---多研究些问题,少谈些主义
- 关于HTML5、Jquery、Phonegap跨域问题的研究
- 关于一个给二维数组循环赋值问题的本渣研究出的解决办法[C#]
- POJ 3624 Charm Bracelet【裸01背包和关于贪心解 01 背包问题的思考】
- 关于动态规划------背包问题
- 关于qtcreator+vs2008+CDB调试太卡的问题研究
- 关于硬链接与软连接占用磁盘空间问题的分析研究
- <志良电子>关于LED控制卡显示内容上下行有虚点的问题研究(一)
- 关于最优化问题(贪心,背包,活动安排)小谈
- 关于python进制与字符转换的问题研究
- 【Forge】Minecraft 1.7.10 Mod开发研究 - 黑猫背包MOD 【05-一个周不更新根本说明不了什么我的字典里就没有太监这两个字不是字典大小的问题你不要说那些没用的】
- 今天研究了一下关于Asp.net文件上传时的内存消耗问题
- 移动端各终端的适配问题研究--关于viewport
- 关于Delphi的Combox乱码问题的研究
- 关于最优化问题(贪心,背包,活动安排)小谈
- 关于CT107D开发板矩阵按键前两列不工作问题的研究
- 关于内核模块挂载出现“no symbol version for”问题的研究
- 关于网站兼容性问题的研究