2019-11-30
10:05:54
#include <bits/stdc++.h> #include <stdlib.h> #include <stdio.h> using namespace std; #define maxn 10005 #define M 105 int c[M][maxn]; int w[M],v[M]; int x[M];//x[M]表示第i个物品是否放入购物车 int main(){ int i,j,n,W; cout<<"请输入物品的个数: "; cin>> n; cout<<"请输入购物车的容量:"; cin>>W; cout<<"请输入每个物品的重量w 和 价值 v,用空格分开:"; for(int i=1;i<=n;++i){ cin>>w[i]>>v[i]; } for(i=0;i<=n;++i){ c[i][0]=0; } for(j=0;j<=W;++j){ c[0][j] = 0; } for(i=1;i<=n;++i){ for(int j=1;j<=W;++j){ if(j<w[i]){//当物品重量大于购物车容量时,不放入 c[i][j] = c[i-1][j]; } else{ c[i][j] = max(c[i-1][j],c[i-1][j-w[i]]+v[i]); } } } cout<<"装入购物车的最大价值为: "<<c[n][W]<<endl; //逆向构造最优解 j = W; for(i=n;i>0;--i){ if(c[i][j]>c[i-1][j]){ x[i]=1; j -= w[i]; }else{ x[i] = 0; } } cout<<"装入购物车的物品为:"<<endl; for(int i=1;i<=n;++i){ if(x[i]==1){ cout<<i<<" "; } } system("pause"); return 0; }