01背包问题动态规划算法
2018-03-20 17:09
381 查看
#include <cstdio> #define max(u,v) (u)>(v)?(u):(v) #define min(u,v) (u)>(v)?(v):(u) int m[10][20]; int v[10]; int w[10]; int x[10]; void Knapsack(int v[10], int w[10], int c, int n, int m[10][20]) { int i,j,jMax; jMax=min(w -1,c); for(j=0;j<=jMax;j++) m [j]=0; for(j=jMax+1;j<=c;j++) m [j]=v ; for(i=n-1;i>1;i--) { jMax=min(w[i]-1,c); for(j=0;j<=jMax;j++) m[i][j]=m[i+1][j]; for(j=jMax+1;j<=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]); } m[1][c]=m[2][c]; if(w[1]<=c) m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); } void Traceback(int m[10][20], int w[10], int c, int n, int x[10]) { int i; for(i=1;i<n;i++) if(m[i][c]==m[i+1][c]) x[i]=0; else { x[i]=1; c-=w[i]; } x =(m [c])?1:0; } int main() { int i,c=10,n=5; w[1]=2;w[2]=2;w[3]=6;w[4]=5;w[5]=4; v[1]=6;v[2]=3;v[3]=5;v[4]=4;v[5]=6; Knapsack(v,w,c,n,m); Traceback(m,w,c,n,x); for(i=1;i<=n;i++) if(x[i]) printf("(w=%d,v=%d)\n",w[i],v[i]); return 0; }
相关文章推荐
- 01背包问题的动态规划算法
- 01背包问题,是用来介绍动态规划算法最经典的例子
- 01背包问题的动态规划算法
- 01背包问题的动态规划算法、蛮力法和空间优化算法
- 01背包经典问题
- 01背包问题
- 01背包问题
- 51nod 1007 正整数分组 (类01背包问题)
- 背包问题【01、完全(恰好or不超过)、多重】【尚未整理完】
- 动态规划算法------背包问题
- 01背包问题
- 01背包问题
- 01背包问题
- 背包问题(01背包,完全背包,多重背包)
- 动态规划算法-背包问题
- 背包问题总结(01背包、完全背包、多重背包)
- 01背包问题小结
- 01背包问题通俗讲解
- POJ 3624 Charm Bracelet【裸01背包和关于贪心解 01 背包问题的思考】
- 01背包问题