特殊的0-1背包 (用重量表示价值)

max \sum_{i=1}^{n}w_{i}x_{i}

 s.t. \sum_{i=1}^{n}w_{i}x_{i}\leqslant C

现有四个物品重量依次为4、3、6、2,装入载重量为11的背包中:

#include <stdio.h>
int w[20],x[20],bestx[20];
//每个物品的重量、物品是否装入、最好的装入方案
int cw,bestw,n,C,R;
//已装入的重量、最优装入的总重量、有n个物品、背包载重量、背包剩余载重量
void back(int i)
{
	if(i==n+1)
	{
		int j;
		if(cw>bestw)//更新当前的最优解x[]
			for(j=1;j<=n;j++)
				{bestx[j]=x[j];bestw=cw;}
		return ;
	}
	R-=w[i];//剩余物品重量之和

	if(cw+w[i]<=C)//装入此号物品,往左搜索
	{
		x[i]=1;
		cw+=w[i];
		back(i+1);
		cw-=w[i];
	}
	if(cw+R>bestw)//当前已装入的重量+剩余物品的重量 大于 最优重量,往右搜索
	{
		x[i]=0;
		back(i+1);
	}

	R+=w[i];
}
void main()
{
	int k;
	w[1]=4;w[2]=3;w[3]=6;w[4]=2;
	n=4;C=R=11;
	back(1);
	for(k=1;k<=n;k++)
		if(bestx[k]==1)
			printf("装入%d号物品\n",k);
	printf("装入的'总价值'为:%d\n",bestw);
}

运行:

装入1号物品
装入2号物品
装入4号物品
装入的'总价值'为:9
Press any key to continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

todaycode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值