动态规划算法解0-1背包问题
2012-07-15 20:55
288 查看
#include<iostream> #include<time.h> #include<iomanip> using namespace std; template<class Type> void Knapsack(Type* v,int* w,int c,int n,Type** m){ int jMax=min(w -1,c); /************************ if(jMax==c) for(j=0;j<=c;j++) m [j]=0; else if(jMax==w -1) for(j=0;j<=w -1;j++) m [j]=0; **************************/ for(int j=0;j<=jMax;j++) m [j]=0; /************************* if(jMax==w -1) for(j=w ;j<=c;j++) m [j]=v ; *************************/ for(int j=w ;j<=c;j++) m [j]=v ; for(int i=n-1;i>1;i--){ jMax=min(w[i]-1,c); for(int j=0;j<=jMax;j++) m[i][j]=m[i+1][j]; for(int j=w[i];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(c>=w[1]) m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); } template<class Type> void Traceback(Type** m,int* w,int c,int n,int* x){ for(int 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(void ){ int n = 5; int w[6] = {-1, 2, 2, 6, 5, 4}; int v[6] = {-1, 2, 3, 5, 7, 6}; int c = 10; int **ppm = new int*[n+1]; for (int i=0; i<n+1; i++) { ppm[i] = new int[c+1]; } int x[6]; Knapsack<int>(v, w, c, n, ppm); Traceback<int>(ppm, w, c, n, x); cout<<"最优值:"<<ppm[1][c]<<endl; for(int i=1;i<n+1;i++){ cout<<x[i]<<" "; } cout<<endl; for(int i=0;i<n+1;i++){ delete[] ppm[i]; ppm[i]=nullptr; } delete [] ppm; ppm=nullptr; return 0; }
算法参考王晓东《计算机算法设计与分析》
相关文章推荐
- 0-1背包问题动态规划算法
- 算法导论答案 16.2-2 0-1背包问题的动态规划算法
- 动态规划算法分析及实例——求解完全背包问题(java实现)
- 背包问题的动态规划算法和fptas
- 动态规划算法求解0,1背包问题
- 0/1背包问题的动态规划算法
- 动态规划算法解决0-1背包问题
- 01背包问题的动态规划算法
- 每天一道算法题(一) (动态规划算法)背包问题Java实现
- 动态规划算法,背包问题
- [算法]背包问题的动态规划算法解答,C语言实现
- 01背包问题动态规划算法
- 动态规划算法-背包问题
- 背包问题——动态规划算法详解与实例
- 数据结构与算法学习之路:背包问题的贪心算法和动态规划算法
- C++实现动态规划算法之解决0-1背包问题
- 动态规划算法0-1背包问题java实现
- 0-1背包问题(动态规划算法)
- 经典算法题04-动态规划算法(背包问题)
- 背包问题的动态规划算法