#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;
}