计蒜客 正方形 dfs剪枝

要点:
记得剪枝呀!!!当满足条件时候设置flag = true, 当其他分支发现flag = true时,结束该分枝。

#include
#include
#include
#include
using namespace std;
int n;
int p[5];//定义4个桶 
int sum = 0;
int len;
int A[10010];
int t;
bool flag = false; 
bool cmp(int a,int b){
	return a>b;
}
void dfs(int index){
	if(index>n+1||flag==true){
		return;
	}
	if(index==n+1&&p[1]==p[2]&&p[2]==p[3]&&p[3]==p[4]){
		flag =true;
		return;
	}
	//木棍扔第1个桶
	if(p[1]+A[index]<=len){
		p[1] +=A[index];
		dfs(index+1);
		p[1] -=A[index];	
	}
	//木棍扔第2个桶
	if(p[2]+A[index]<=len){
		p[2] +=A[index];
		dfs(index+1);
		p[2] -=A[index];
	}
	//木棍扔第3个桶
	if(p[3]+A[index]<=len){
		p[3] +=A[index];
		dfs(index+1);
		p[3] -=A[index];
	}
	//木棍扔第4个桶
	if(p[4]+A[index]<=len){
		p[4] +=A[index];
		dfs(index+1);
		p[4] -=A[index];	
	}
}
int main(){
	memset(p,0,sizeof(p));
	//freopen("in.txt","r",stdin);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>A[i];
		sum += A[i];
	}
	if(sum%4!=0){
		flag = false;
		cout<<"No\n";
	}
	else{
		len = sum/4;
		sort(A+1,A+n+1,cmp);
		dfs(1);
		if(flag){
			cout<<"Yes\n";
		}
		else{
			cout<<"No\n";
		}	
	}
	return 0;
}

你可能感兴趣的:(搜索问题,计蒜客)