using namespace std;
using name
#include<iostream>
usingnamespace std;
voidknapsack(int v[],int w[],int c,int *m[],int n){
int jMax=min(w[n]-1,c);
for(int j=0;j<=jMax;j++){
m[n][j]=0;
}
for(int j=w[n];j<=c;j++){
m[n][j]=v[n];
}//首先计算第n个物品的最优解
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]);
}
}//再计算第2个到第n-1个物品的最有
m[1][c]=m[2][c];
if(c>=w[1]) {
m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
}//最后求第1个物品的最优解
}
voidtraceback(int *m[],int w[],int c,int x[],int n){
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[n]=m[n][c]>0? 1:0;
}
}//用1/0表示物品有没有被使用
intmain(){
cout<<“首先请输入揹包容量C:”<<endl;
int c;
cin>>c;
cout<<“再输入物品数量N:”<<endl;
int n;cin>>n;
cout<<“按照物品的顺序依次输入每个物品的重量和价值:”<<endl;
int *w=new int[n+1];
int *v=new int[n+1];
for(int i=1;i<=n;i++){
cin>>w[i];
cin>>v[i];
}//以上全为输入
int *x=new int [n+1];//x[i]表示第i个物品有没有被使用
int **m=new int*[n+1];
for(int i=0;i<n+1;i++){
m[i]=new int[c+1];
}//定义二维数组m[i][j]
knapsack(v,w,c,m,n);
traceback(m,w,c,x,n);
for(int i=1;i<=n;i++){
if(x[i]==1)
cout<<“第”<<i<<“个物品被使用了”<<endl;
}//输出结果
cout<<endl;
system(“pause”);
return 0;
}