回溯求解01背包问题的算法

//采用剪枝求解01背包问题的算法
#include stdio.h
#define MAXN 20					//最多物品数
问题表示
int n=4;						//4种物品
int W=6;						//限制重量为6
int w[]={0,5,3,2,1};			//存放4个物品重量,不用下标0元素
int v[]={0,4,4,3,1};			//存放4个物品价值,不用下标0元素
求解结果表示
int x[MAXN];					//存放最终解
int maxv; 						//存放最优解的总价值
void dfs(int i,int tw,int tv,int op[]) //考虑第i个物品
{
	if (in)					//找到一个叶子结点
	{	if (tw==W && tvmaxv) 	//找到一个满足条件的更优解,保存它
		{	maxv=tv;
			for (int j=1;j=n;j++)
				x[j]=op[j];
		}
	}
	else						//尚未找完所有物品
	{	if (tw+w[i]=W)			//左孩子结点剪枝:满足条件时才放入第i个物品
		{	op[i]=1;			//选取第i个物品
			dfs(i+1,tw+w[i],tv+v[i],op);
		}
		op[i]=0;				//不选取第i个物品,回溯
		dfs(i+1,tw,tv,op);
	}
}
void dispasolution()	//输出最优解
{	int i;
	printf(最佳装填方案是n);
	for (i=1;i=n;i++)
		if (x[i]==1)
			printf(  选取第%d个物品n,i);
	printf(总重量=%d,总价值=%dn,W,maxv);
}
void main()
{
	int op[MAXN];				//存放临时解
	dfs(1,0,0,op);
	dispasolution();
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Clark-dj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值