01背包问题
2015-09-19 01:08
357 查看
参考了http://www.cnblogs.com/qinyg/archive/2012/04/26/2471829.html
关键的状态转移方程如下
令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:
(1) V(i,0)=V(0,j)=0
(2) V(i,j)=V(i-1,j) j<wi
V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi
(1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
用poj3624练手
第一次开二维dp数组,直接超内存
第二次用两个一维数组交替,内存是没超,但是耗时400多ms,而且代码比较丑陋
View Code
关键的状态转移方程如下
令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:
(1) V(i,0)=V(0,j)=0
(2) V(i,j)=V(i-1,j) j<wi
V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi
(1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
用poj3624练手
第一次开二维dp数组,直接超内存
第二次用两个一维数组交替,内存是没超,但是耗时400多ms,而且代码比较丑陋
#include <iostream> #include <string> #include <sstream> #include <vector> using namespace std; int dp[12900]; int w[3410], d[3410]; int main() { int n, m; cin >> n >> m; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { cin >> w[i] >> d[i]; } for (int i = 1; i <= n; i++) { for (int j = m; j > 0; j--) { int x = dp[j]; int y = 0; if(j >= w[i]) y = dp[j - w[i]] + d[i]; dp[j] = x < y ? y : x; } } cout << dp[m] << endl; //system("pause"); }
View Code
相关文章推荐
- nginx 图片缓存配置
- 开发eclipse时老师导入Android.R;包,实际应该要项目.R;
- OSChina 周六乱弹 —— 你妈当年如何看上你爸的?
- ubuntu下安装codeblocks
- 数据摘要算法的测试效率(SHA、MD5和CRC32)
- linux文件操作之cut命令
- 我的java环境配置
- Android一个ListView列表之中插入两种不同的数据
- MYSQL基础01(新增,修改,删除)
- js控制iframe父子页面js相互调用
- sbt 0.13.8 URI has an authority component
- iOS 随机数的产生
- Android下拉刷新,上拉加载
- Linear Algebra线性代数相关
- FreeRadius 根据mysql 下发指定地址池的地址...
- Android水平列表循环插入数据
- hadoop2.6.0集群配置
- emacs自己的总结问题笔记
- Android下拉列表使用方法
- OOP面向对象编程的几大原则