1. 程式人生 > >hdu 1518 Square

hdu 1518 Square

dfs要剪枝不然超時

剪枝:將木棒的長度排序,每個邊的木棒都是從小到大,減去了每條邊木棒不是升序的情況

搜尋(1+7)了,(7+1)就不用了

#include<stdio.h>
#include<stdlib.h>
int n,a[30],vis[30],L;
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
int dfs(int ans,int sum,int num)
{
	int i;
	if(ans==3)return 1;
	for(i=num;i<n;i++)
	{
		if(vis[i])continue;
		if(sum+a[i]==L)
		{
			vis[i]=1;
			if(dfs(ans+1,0,0)==1)//找到了相等的,就找沒用過最小的木棒繼續,所以num從0開始
				return 1;
			vis[i]=0;
		}
		if(sum+a[i]<L)
		{
			vis[i]=1;
			if(dfs(ans,sum+a[i],i)==1)//只找比a[i]大的與a[i]組合,所以num從i開始
				return 1;
			vis[i]=0;
		}
	}
	return 0;
}
int main()
{
	int i,j,m,t;
    scanf("%d",&t);
	while(t--)
	{
		m=0;
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			m+=a[i];
		}
		L=m/4;
		if(m%4!=0)
		{
			printf("no\n");
			continue;
		}
		qsort(a,n,sizeof(a[0]),cmp);
		for(i=0;i<n;i++)
			vis[i]=0;
		if(dfs(0,0,0)==1)printf("yes\n");
		else printf("no\n");
	}
	return 0;
}