PTA7-2 0-1背包 (50 分) 回溯法

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA7-2 0-1背包 (50 分) 回溯法相关的知识,希望对你有一定的参考价值。


输入:

5 10
2 6
2 3
6 5
5 4
4 6

输出:

15

重要的是剪枝。
感谢x同学。

上界是给“不拿”用的。
如果不拿的再加上上界的值小于当前最优值,就return。(没有搞头了)

#include<bits/stdc++.h>
using namespace std;
struct node

	int w,v;
	double dj;
a[105];
int n,c;
bool cmp1(node a,node b)//dfs 用 

	if(a.v!=b.v) return a.v>b.v;
	else return a.w<b.w;

bool cmp2(node a,node b)//bound 用 

	return a.dj>b.dj;

int bound(int u,int cc)//返回第u个物品 剩cc容量 的上界 

	node b[105];
	int j=0;
	for(int i=u;i<=n;i++)
	
		b[j++]=a[i];
	
	sort(b,b+j,cmp2);
	int anss=0;
	for(int i=0;i<j;i++)
	
		if(cc>=b[i].w)
		
			anss+=b[i].v;
			cc-=b[i].w;
		
		else
		
			anss+=(b[i].dj*cc);
			cc=0;break;
		
	
	return anss;

int ans=-1;
void dfs(int u,int sum,int cc)//第u个物品 v之和 c容量剩余 

	if(u>n) ans=max(ans,sum);	
	else
	
		//拿
		if(cc-a[u].w>=0) dfs(u+1,sum+a[u].v,cc-a[u].w);		 
		//不拿
		int bou=bound(u,cc);
		if(bou+sum>ans) dfs(u+1,sum,cc);
	
 
int main()

	cin>>n>>c;
	for(int i=1;i<=n;i++)
	
		int w,v; double dj;
		cin>>w>>v;	
		dj=v*1.0/w;
		a[i]=w,v,dj;		
	
	dfs(1,0,c);
	cout<<ans;
	return 0;

以上是关于PTA7-2 0-1背包 (50 分) 回溯法的主要内容,如果未能解决你的问题,请参考以下文章

0-1背包问题的回溯法中,剪枝用的上界函数问题

分别用回溯法和动态规划求0/1背包问题(C语言代码)

0-1背包问题如下,画用回溯法求解时的搜索情况,急用啊

用回溯法做0-1背包问题,这两行(程序中标注)是干嘛?为啥又要减?

0-1背包问题(回溯法)

0-1背包问题(回溯法)