题目要求:
设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量W,但选中的物品的价值之和为最大。注:物品要么被选中,要么不被选中。
#include<iostream>
using namespace std;
#define max 10000
const int W = 150;
//pack( i {处理到第i件物品} , j{剩余的重量为j});
int pack(int i, int j,int v[],int w[])
{
int r1 = 0;
int r2 = 0;
int r = 0;
if (i == -1)
{
return 0;
}
if(j >= w[i]) //背包剩余空间可以放下物品 i
{
r1 = pack(i-1,j - w[i],v,w) + v[i]; //第i件物品放入所能得到的价值
r2 = pack(i-1,j,v,w); //第i件物品不放所能得到的价值
r = (r1>r2)?r1:r2;
}
return r;
}
int main()
{
int x;
int i;
int value[max],weight[max];
cout<<"商品的数量为:";
cin>>x;
cout<<"录入物品价值:";
for(i=0;i<x;i++)
{
cin>>value[i];
}
cout<<"物品价值依次为:";
for(i=0;i<x;i++)
{
cout<<value[i]<<" ";
}cout<<endl;
cout<<"录入物品重量:";
for( i=0;i<x;i++)
{
cin>>weight[i];
}
cout<<"物品重量依次为:";
for( i=0;i<x;i++)
{
cout<<weight[i]<<" ";
}cout<<endl;
cout<<"商品的数量为:"<<x<<"个"<<endl;
cout<<"限定的重量为:"<<W<<"Kg"<<endl;
int maxValue = pack(x, W,value,weight);
cout<<"选出商品的最大价值为: "<<maxValue<<endl;
return 0;
}