01背包问题(动态规划DP)
2010-11-26 18:15
337 查看
#include<iostream> using namespace std; int c[10][100];/*行代表是覆盖的背包个数,而列代表背包容量*/ int Knapsack(int n,int m) { int i,j; int w[10],v[10];/*分别代表各个物品的重量和价值*/ for(i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]);/*输入每个物品的重量W和价值V*/ for(i=0;i<10;i++)/*初始化数组C*/ for(j=0;j<100;j++) c[i][j]=0; for(i=1;i<=n;i++)/*物品覆盖得越来越多*/ for(j=1;j<=m;j++)/*背包的容量则逐一测试*/ { if(w[i]<=j)/*如果物品的重量小于当前背包的容量*/ { /*如果当前物品的价值+剩余容量所能装载的最大价值〉在没有选择当前物品时的最大价值则更新C[][];*/ if(c[i-1][j]<v[i]+c[i-1][j-w[i]]) c[i][j]=v[i]+c[i-1][j-w[i]]; else//否则不更新 c[i][j]=c[i-1][j]; } else/*如果物品的重量大于当前背包的容量,那么这个物品不使用,这表明C[][]不变,则C[][]使用前面得到的最优解*/ c[i][j]=c[i-1][j]; } return c [m]; } int main() { int n,m;/*n为背包个数,m为背包容量*/ printf("input m and n/n"); scanf("%d%d",&m,&n); printf("%d",Knapsack(n,m)); printf("/n"); int i,j; for(i=0;i<=n;i++) { for(j=0;j<=m;j++) printf("%3d",c[i][j]); printf("/n"); } return 0; } /* 测试用例为: 10 5//10是背包容量,5是背包个数 2 6 2 3 6 5 5 4 4 6 */
#include<iostream> using namespace std; int c[10][100];/*行代表是覆盖的背包个数,而列代表背包容量*/ int x[10];//存放最优解 int Knapsack(int n,int m,int w[],int v[]) { int i,j; for(i=0;i<10;i++)/*初始化数组C*/ for(j=0;j<100;j++) c[i][j]=0; for(i=1;i<=n;i++)/*物品覆盖得越来越多*/ for(j=1;j<=m;j++)/*背包的容量则逐一测试*/ { if(w[i]<=j)/*如果物品的重量小于当前背包的容量*/ { /*如果当前物品的价值+剩余容量所能装载的最大价值〉在没有选择当前物品时的最大价值则更新C[][];*/ if(c[i-1][j]<v[i]+c[i-1][j-w[i]]) { c[i][j]=v[i]+c[i-1][j-w[i]]; } else//否则不更新 { c[i][j]=c[i-1][j]; } } else/*如果物品的重量大于当前背包的容量,那么这个物品不使用,这表明C[][]不变,则C[][]使用前面得到的最优解*/ { c[i][j]=c[i-1][j]; } } return c [m];//矩阵的最后一个为最优解。 } void Trackback(int c[][100],int w[],int m,int n) { int i; for(i=n;i>0;i--) { if(c[i][m]==c[i-1][m])//表示序号为i的物品没有被装入背包 x[i]=0; else { x[i]=1; m-=w[i]; } } } int main() { int n,m;/*n为背包个数,m为背包容量*/ int i,j; printf("input m and n/n"); scanf("%d%d",&m,&n); int w[10],v[10];/*分别代表各个物品的重量和价值*/ for(i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]);/*输入每个物品的重量W和价值V*/ printf("%d",Knapsack(n,m,w,v)); printf("/n"); for(i=0;i<=n;i++) { for(j=0;j<=m;j++) printf("%3d",c[i][j]); printf("/n"); } Trackback(c,w,m,n);//找最优解 for(i=1;i<=n;i++) cout<<x[i]<<" "; cout<<endl; return 0; } /* 测试用例为: //10是背包容量,5是背包个数 10 5 2 6 2 3 6 5 5 4 4 6 */
相关文章推荐
- 01背包问题(动态规划DP)
- 一中OJ #1453 马棚问题 | 动态规划 序列分组DP | 解题报告
- 动态规划(DP)——HDU1081、PKU1050 To The Max 最大子矩阵问题
- 动态规划之01背包问题(最易理解的讲解)
- 动态规划之01背包问题
- DP Bone Collector(01背包问题)
- 动态规划-01背包问题
- 采药 水题 dp 01背包问题 luogu1048
- 动态规划(Dynamic programming,DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。通常许多
- 采药 水题 dp 01背包问题 luogu1048
- 苹果(01背包问题)——动态规划
- 01背包问题-动态规划
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- DP_01背包_装箱问题
- 动态规划之01背包问题
- 动态规划的经典问题初探: Best Time to Buy and Sell Stock(DP)
- nyoj289 苹果 典型01背包问题(动态规划)思路及实现过程
- 动态规划实现 01背包问题
- 动态规划之01背包问题
- HDU - 2602(动态规划,01背包问题)