0-1背包问题--回溯+贪心

0-1背包问题的回溯算法可以像以往的回溯算法一样一层一层的寻找,但查看限界函数Bound(i)时,如果Bound(i)<bestv则停止搜索第i层节点及其子树,否则继续搜索。显然r(i)越小,bound(i)越小,剪去的分支就会越多,为了构建更少的r(i),,将物品以单位重量价值降序排列,对于第i层背包的剩余容量,采用贪心算法把剩余的物品放入背包,此时剩余物品的价值是最优的,因为对于剩余物品不存在比上述贪心算法最优的

回溯算法:

void backtrack(int i){
	if(i+1>n) {bestv=cv; return;
	}
	if(cw+Q[i].w<c){
		cw+=Q[i].w;
		cv+=Q[i].v;
		backtrack(i+1);
		cw-=Q[i].w;
		cv-=Q[i].v;
	}
	if(Bound(i+1)>bestv) backtrack(i+1);
}

贪心算法

double Bound(int i){
	int cleft=c-cw;
	int b=cv;
	while(i<n&&cleft=>Q[i].w){
		cleft-=Q[i].w;
		b+=Q[i].v;
		i++;
	}
	if(i<n) b+=cleft*Q[i].d;
	return b;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值