
#include<iostream> using namespace std; //int n1=5,m1=10//不可以传到函数做参数,如fun[n1][m1],不可以,既是[]内不可以是变量 #define m1 10 //有n个物品,背包能承载的重量是m #define n1 5 int Max(int a,int b){ return a>=b? a:b; } int DynamicProgramming(int n,int m,int W[],int Value[],int V[n1+1][m1+1],int X[]){ /* int n,m;//有n个物品,背包能承载的重量是m int V[n+1][m+1],X[n+1]; double W[n+1],Value[n+1];//n个物品的重量和价值*/ //初始化 for(int i=0;i<=n;i++) V[i][0]=0; for(int j=0;j<=m;j++) V[0][j]=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(j<W[i]) V[i][j]=V[i-1][j]; else{ V[i][j]=Max(V[i-1][j],V[i-1][j-W[i]]+Value[i]); } } int j=m; for(int i=n;i>=1;i--){ if(V[i][j]>V[i-1][j]){ j-=W[i]; X[i]=1; } else{ X[i]=0; } } return V[n][m]; } int main(){ //cout<<"Please input n :"; //cin>>n; int V[n1+1][m1+1],X[n1+1]; int W[n1+1],Value[n1+1];//n个物品的重量和价值*/ W[0]=0;Value[0]=0; cout<<"Please input W[] and Value[]:"; for(int i=1;i<=n1;i++) cin>>W[i]>>Value[i]; cout<<"The max value is:"<<DynamicProgramming(n1,m1,W,Value,V,X)<<endl; for(int i=1;i<=n1;i++){ if(X[i]=1) cout<<i; } return 0; }
首先要明白满足动态规划的条件:
一:最优化原理
二:无后向性
三:子问题的重叠性
动态规划问题的解题步骤:
(我认为学习一门新的算法必须要做的事是:明确算法满足条件,要能够背出来;明确解决满足改算法的步骤,一样能够铭记于心)
1.把原问题分成各个互相重叠的子问题
2.判断问题是否满足最优性子结构,若满足则写出递推方程
3.按照递推式,从底向上求解!
另一个代码:

#include<iostream> using namespace std; int V[100][100];//存储前i个物品装入容量为j的背包中获得的最大价值 int max(int w1,int w2){ int w; return w=w1>w2?w1:w2; } int KnapSack(int n,int *w,int *v,int C,int *x){ int j; for(int i=0;i<=n;i++) V[i][0]=0; for(int j=0;j<=C;j++) V[0][j]=0; for(int i=1;i<=n;i++) for(j=1;j<=C;j++) if(j<w[i]) V[i][j]=V[i-1][j]; else V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]); j=C; for(int i=n;i>0;i--){ if(V[i][j]>V[i-1][j]){ x[i]=1; j=j-w[i]; } else x[i]=0; } return V[n][C]; } int main(){ int n,C;//n物品的个数,C为背包的最大容量 int x[100];//记录物品放进背包的状态 int w[100],v[100]; //第i个物品的重量为w[i]价值为v[i]; cout<<"物品个数n:"; cin>>n; cout<<"背包最大容量C:"; cin>>C; cout<<"请输入 "<<n<<"物品的重量的质量:"<<endl; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; cout<<"最大价值:"<<KnapSack(n,w,v,C,x)<<endl; cout<<"装进背包的物品编号是:"<<endl; for(int i=1;i<=n;i++) if(x[i]==1) cout<<i<<" "; cout<<endl; return 0; }