问题:
给定n种物品和一个背包i(1<=i<=n)的重量是Wi,其价值为Vi,背包的容量为C,对每种物品只能有两种选择:装入或者不装入背包。如何选择装入背包的物品使得装入背包中的物品的总价值最大?
算法使用C++语言实现:
|
w[]:物品的重量数组:2,2,6,5,4
v[]:物品的价值数组:6,3,5,4,6
n:物品的数量:5
C:背包的容量:10
x[5]:存储物品拿与不拿的状态的数组
*/
#include<iostream.h>
int max(int a,int b)
{
if(a>=b)
return a;
else return b;
}
int KnapSack(int n,int w[],int v[],int x[],int C)
{
int i,j;
for(i=0;i<=n;i++)
V[i][0]=0;
for(j=0;j<=C;j++)
V[0][j]=0;
for(i=0;i<=n-1;i++)
for(j=0;j<=C;j++)
if(j<w[i])
V[i][j]=V[i-1][j];
else
V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
j=C;
for(i=n-1;i>=0;i--)
{
if(V[i][j]>V[i-1][j])
{
x[i]=1;
j=j-w[i];
}
else
x[i]=0;
}
cout<<"选中的物品是:"<<endl;
for(i=0;i<n;i++)
cout<<x[i]<<endl;
return V[n-1][C];
}
void main()
{
int s;//获得的最大价值
int w[5];//物品的重量
int v[5];//物品的价值
int x[5];//物品的选取状态
int n,i;
int C;//背包最大容量
cout<<"请输入背包的最大容量:"<<endl;
cin>>C;
cout<<"物品数量:"<<endl;
cin>>n;
cout<<"请分别输入物品的重量:"<<endl;
for(i=0;i<n;i++)
cin>>w[i];
cout<<"请分别输入物品的价值:"<<endl;
for(i=0;i<n;i++)
cin>>v[i];
s=KnapSack(n,w,v,x,C);
cout<<"最大价值为:"<<s<<endl;
}