求解背包问题

/*背包问题:设有不同价值、不同重量的物品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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值