0
点赞
收藏
分享

微信扫一扫

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

Java旺 2022-04-14 阅读 47
算法c++

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 条评论