动态规划之01背包问题
2017-11-20 21:27
169 查看
给定
解题思路:
最终的目标是在总重量不超过
由上面的叙述可知:
当
当
接下来我们看看代码:
n种物品和一个背包,物品i的重量是
w[i],其价值是
v[i],所有物品的重量和价值都是非负的,背包的容量是
C。我们限定每种物品只能选择0个或者1个。问应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?
解题思路:
最终的目标是在总重量不超过
C的前提下,使得总价值最高。在总重量不超过
Y(Y<=C)的前提下,我们将前i种物品的总价值所能达到的最高价值定义为
value[i][Y],由此我们可以得到这个问题的最优解与子问题的最优解相同(最优子结构性质),可用动态规划求解。
由上面的叙述可知:
value[0][Y]=0
0<=Y<=C
value[i][0]=0
1<=i<=n
当
w[i]>Y时,
value[i][Y]=value[i-1][Y](物品
i不能放入背包,所以总价值还是前一个物品放入时的价值。)
当
w[i]<=Y时,
value[i][Y]=max(value[i-1][Y],value[i-1][Y-w[i]]+v[i]。(
value[i-1][Y]表示不能放入,
value[i-1][Y-w[i]]+v[i]表示放入进去。然后在这两种情况中选取最大值。先把表填了,这样才能更好理解!表格如下:
接下来我们看看代码:
#include <iostream> using namespace std; int value[200][200]; int max(int a,int b); int KnapStack(int n,int w[],int v[],int x[],int C); //求最大价值以及是哪些物品被选中 int main(int argc, char** argv) { int maxSum;//最大价值 int w[10];//重量数组 int v[10];//价值数组 int x[10];//选中的数组 int n;//物品数量 int C;//最大容量 cout<<"请输入物品数:"<<endl; cin>>n; cout<<"请输入背包的最大容量:"<<endl; cin>>C; cout<<"请分别输入物品的重量:"<<endl; for(int i=0;i<n;i++){ cin>>w[i]; } cout<<"请分别输入物品的价值:"<<endl; for(int i=0;i<n;i++){ cin>>v[i]; } maxSum=KnapStack(n,w,v,x,C); cout<<"最大物品价值为:"<<endl; cout<<maxSum<<endl; return 0; } int max(int a,int b){ if(a>=b){ return a; } else{ return b; } } int KnapStack(int n,int w[],int v[],int x[],int C){ for(int i=0;i<=n;i++){ value[i][0]=0;//value[i][0]=0 } for(int Y=0;Y<=C;Y++){ value[0][Y]=0;//value[0][Y]=0 } for(int i=0;i<n;i++){//二层for循环用作创建表 for(int Y=0;Y<=C;Y++){ if(Y<w[i]){ value[i+1][Y]=value[i][Y]; }//value[i][],i的下标从0开始 //不能往背包里面放 else{ value[i+1][Y]=max(value[i][Y],value[i][Y-w[i]]+v[i]); } } } int Y=C; for(int i=n-1;i>=0;i--){ if(value[i+1][Y]>value[i][Y]){ x[i]=1; Y-=w[i]; } else{ x[i]=0; } } cout<<"选中的物品是:"<<endl; for(int i=0;i<n;i++){ cout<<x[i]<<"\t"; } cout<<endl; return value [C]; }
相关文章推荐
- nyoj289 苹果 典型01背包问题(动态规划)思路及实现过程
- 01背包问题(动态规划DP)
- 01背包问题 动态规划
- 动态规划之01背包问题
- 动态规划——01背包问题
- 动态规划-01背包问题
- 01背包----动态规划,背包问题
- 动态规划之01背包问题 通俗理解动态规划的过程
- 数据结构基础 从01背包问题理解动态规划
- 动态规划之01背包问题
- POJ - 3624 (01背包问题)(动态规划-滚动数组)
- 苹果(01背包问题)——动态规划
- 【动态规划】之01背包问题(难度:2星)
- 动态规划之01背包问题
- 01背包问题(动态规划)python实现
- 动态规划之01背包问题
- Dynamic Programming 0-1 knapsacks 动态规划之01背包问题
- 动态规划之01背包问题(最易理解的讲解)
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
- 动态规划之01背包问题