辛苦我们聪明的漂亮的小王同学的修改,才得以运行成功,现在将代码附上,具体的算法分析请参考《算法分析与设计》 清华大学出版社
#include <iostream>
using namespace std;
class Init
{
public :
//用于后面判断
int Max(int a,int b)
{
return a>b?a:b;
}
void inputW(int w[],int n)
{
cout<<"请输入每个物品的重量\n";
for(int i=0;i<n;i++)
cin>>w[i];
}
void inputV(int v[],int n)
{
cout<<"请输入每个物品的价值\n";
for(int i=0;i<n;i++)
cin>>v[i];
}
//n用于表示物质的个数 W表示背包所能装下的物体的总的重量
//w[]用于存放每个物品的重量 v[]用于存放每个物品的价值
int KnapSack(int n,int W,int w[],int v[],int x[])
{
int j,C[n+1][W+1];
//初始化第0列
for(int i=0;i<=n;i++)
{
C[i][0]=0;
}
//初始化第0行
for( int i=0;i<=W;i++)
{
C[0][i]=0;
}
/* cout<<"每个物品的重量\n";
for(int i=0;i<n;i++)
cout<<w[i]<<" ";
cout<<endl;
cout<<"请输入每个物品的价值\n";
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
for(int i=0;i<n;i++)
cout<<x[i]<<" ";
cout<<endl;
*/
for(int i=1;i<=n;i++)
for(j=1;j<=W;j++)
//由于w[]数组的下标是从0开始的所以,这个地方下标要为才可以i-1
if(j<w[i-1])
C[i][j]=C[i-1][j];
else
//同样的道理对于w[]数组和v[]数组的下标,第一个元素都要从i-1开始才可以
C[i][j] = Max(C[i-1][j],C[i-1][j-w[i-1]]+v[i-1]);
j=W;
for(int i=n;i>0;i--)
if(C[i][j]>C[i-1][j])
{
x[i-1]=1;
j-=w[i-1];
}
else
{
x[i-1]=0;
}
return C[n][W];
}
};
int main()
{
int n;
int W;
int w[100];
int v[100];
int x[10];
cout<<"请输人物品的数量"<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
x[i]=0;
}
cout<<"请输入背包的总容量"<<endl;
cin>>W;
Init a;
a.inputW(w,n);
a.inputV(v,n);
a.KnapSack(n,W,w,v,x);
for(int i=0;i<n;i++)
{
cout<<x[i]<<" ";
}
return 0;
}