hdu1518 dfs,回溯

TLE了好久!!唉……还是剪枝不到位啊。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[25],n;
int sum;
int vis[25];
bool dfs(int tot,int pos,int top)		//pos记录位置,tot记录当前总数,top记录已经得到的边数
{
    if(tot==sum)
		if(top==3) return 1;			//3条边都好了就可以结束了
			else return dfs(0,1,top+1);

    for(int i=pos;i<=n;i++)
    {
        if(tot+a[i]>sum) break;			//a是从小到大排序了的,如果当前a[i]都大了,后面的就更不用算了。
        if(!vis[i]&&tot+a[i]<=sum)
        {
            vis[i]=1;
            if(dfs(tot+a[i],i+1,top))
				return 1;      
            vis[i]=0;
        }
    }
	return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int max=-1;
        sum=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>max) max=a[i];
            sum+=a[i];
        }				//周长不是4的倍数或者最长的比1/4周长还长,直接no。
        if(sum%4!=0||max>sum/4) {printf("no\n");continue;}
        sum=sum/4;
        memset(vis,0,sizeof(vis));
        sort(a+1,a+1+n);
        if(dfs(0,1,0)) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}


你可能感兴趣的:(hdu1518 dfs,回溯)