/*背包问题:设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,便选中的
物品的价值之和为最大*/
/*第i件物品的选择有两种可能:
(1)物品i被选择,这种可能性仅当包含它不会超过方案总重量的限制时才是可行的。选中后,继续递归去考虑其余物品的选择
(2)物品i不被选择,这种可能性仅当不包含物品i也有可能找到价值更大的方案的情况*/
/*exp6-3.cpp*/
#include<stdio.h>
#define N 100
int limitw;/*限制的总重量*/
int totv;/*全部物品的总价值*/
int maxv;
int option[N],cop[N];
struct
{
int weight;
int value;
}a[N];
int n;
void find(int i,int tw,int tv)/*物品种数次*/
{
int k;
if(tw+a[i].weight<=limitw)
{
cop[i]=1;
if(i<n-1)
find(i+1,tw+a[i].weight,tv);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv;
}
cop[i]=0;
}
if(tv-a[i].value>maxv)
if(i<n-1)
find(i+1,tw,tv-a[i].value);
else
{
for(k=0;k<n;k++)
option[k]=cop[k];
maxv=tv-a[i].value;
}
}
void main()
{
int k,w,v;
printf("物品种数:");
scanf("%d",&n);
for(totv=0,k=0;k<n;k++)
{
printf("第%d种物品(重量,价值):",k+1);
scanf("%d,%d",&w,&v);
a[k].weight=w;
a[k].value=v;
totv+=v;
}
printf("所能承受的总重量:");
scanf("%d",&limitw);
maxv=0;
for(k=0;k<n;k++)
cop[k]=0;
find(0,0,totv);
printf("最佳装填方案是:\n");
for(k=0;k<n;k++)
if(option[k])
printf("第%d种物品\n",k+1);
printf("总价值=%d\n",maxv);
}