本以为自己对dfs了解的可以了,可是这道题,我还是参看了别人的代码,自己设计的dfs不论怎样跳出,一直TLE。。。伤不起啊。。。
里面是各种return。。。。。。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int vis[20],len[20],n,aver;
int dfs(int i,int j,int amount)
{
if(amount<0||j<0) return 0;
if(amount==0)
{
if(i==2) return 1;
return dfs(i+1,n-1,aver);
}
if(!vis[j])
{
vis[j]=1;
if(dfs(i,j-1,amount-len[j])) return 1;
vis[j]=0;
while(j&&len[j]==len[j-1])
j--;
}
return dfs(i,j-1,amount);
}
int main()
{
int k,i,flag;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
aver=0;
for(i=0;i<n;i++)
{
scanf("%d",&len[i]);
aver+=len[i];
}
if(aver%4)
{
printf("no\n");
continue;
}
else
{
aver/=4;
sort(len, len+n);
if(len[n-1]>aver)
{
printf("no\n");
continue;
}
memset(vis,0,sizeof(vis));
flag=dfs(0,n-1,aver);
if(flag) printf("yes\n");
else printf("no\n");
}
}
return 0;
}