背包问题与动态规划问题初学
2011-03-24 22:34
435 查看
01背包
状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
本人初学,在网上找了N久的动态规划和01背包的资料,虽然有一些讲的很生动,我也在概念上理解了动态规划和01背包的原理,但是总觉得无法形象的表达整体的运算过程,于是画了个表格形象地记录一下这个过程。上面箭头表示了每次的比较的两个数据,较大的存放在箭头的尾部,根据观察可以看出,每次比较的都是本次第N个数据与上次循环结果的第(N-此次物品重量)个数据,也就是没放入这个物品之前的最优解。
每一列代表每个不同容量的背包的情况 每行代表放入不同物品的情况。
粘个一维数组实现的代码
#include <iostream> using namespace std; int main(void){ int cases=0; int maxVolume=0; int nGoods=0; int weight[1024]; int value[1024]; int record[1024]; cin>>cases; while(cases--){ memset(record,0,sizeof(record)); cin>>nGoods>>maxVolume; for(int i=0;i<nGoods;i++) cin>>value[i]>>weight[i]; for(i=0;i<nGoods;i++) for(int j=maxVolume;j>=weight[i];j--) if(record[j]<record[j-weight[i]]+value[i]) record[j]=record[j-weight[i]]+value[i]; cout<<record[maxVolume]<<endl; } return 0; }
#include <iostream> using namespace std; int main(void){ int cases=0; int maxVolume=0; int nGoods=0; int weight[1024]; int value[1024]; int record[1024]; cin>>cases; while(cases--){ memset(record,0,sizeof(record)); cin>>nGoods>>maxVolume; for(int i=0;i<nGoods;i++) cin>>value[i]>>weight[i]; for(i=0;i<nGoods;i++) for(int j=maxVolume;j>=weight[i];j--) if(record[j]<record[j-weight[i]]+value[i]) record[j]=record[j-weight[i]]+value[i]; cout<<record[maxVolume]<<endl; } return 0; }
多重背包
状态转移方程:
f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}
[b](0<=k<=v/w[i])[/b][b]待续...[/b]
相关文章推荐
- 【初学动态规划】之01背包问题
- 动态规划—0-1背包问题
- 动态规划---->0/1背包问题
- 动态规划:背包问题
- 动态规划--背包问题、比值问题转背包问题
- 动态规划0——1背包问题
- 利用0-1背包问题谈动态规划
- 动态规划的两个经典问题--01背包
- 动态规划解0-1背包问题
- 动态规划解决0-1背包问题
- 0/1背包问题动态规划详解
- 【算法】——动态规划之0-1背包问题
- 动态规划之找零钱问题与背包问题
- 0/1背包问题动态规划 空间复杂度是o(C)
- 动态规划之背包问题
- leetcode 279. Perfect Squares 类似背包问题 + 很简单的动态规划DP解决
- 动态规划_背包问题基础
- 动态规划之0--1分数背包问题
- 动态规划之背包问题,最基础的动态规划
- 【初学动态规划】之装箱问题