参考教材
《算法分析与设计及案例教程》
代码
#include <iostream>
using namespace std;
void Knapsack(int v[100],int w[101],int c,int n,int m[101][101]){
int jMax=min(w[n]-1,c);
//处理只有一个物品的情况,即第n个物品
for(int j=0;j<=jMax;j++){//第n个物品不选
m[n][j]=0;
}
for(int j=w[n];j<=c;j++){//选择第n个物品
m[n][j]=v[n];
}
//处理多个物品情况,从n-1到2逐层计算m[i][j]的值
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]);
}
}
m[1][c]=m[2][c];
//处理边界条件
if(c>=w[1]){
m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
}
cout<<"最优值:"<<m[1][c]<<endl;
}
void Traceback(int m[101][101],int w[101],int c,int n,int x[101]){
for(int i=1;i<n;i++){
if(m[i][c]==m[i+1][c]){
x[i]=0;
}
else{
x[i]=1;
c=c-w[i];
}
x[n]=(m[n][c])?1:0;
}
for(int i=1;i<=n;i++){
cout<<x[i]<<" ";
}
}
int main(){
int n,w[101],c,v[101],m[101][101],x[100];
cout<<"第一行输入有多少个物品和背包容量。之后的每一行输入每个物品的重量和价值。"<<endl;
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
Knapsack(v,w,c,n,m);
Traceback(m,w,c,n,x);
return 0;
}