http://acm.hdu.edu.cn/showproblem.php?pid=1518
#include<stdio.h>
#include<string.h>
int ok,vis[30],a[30];
int sum,n,m;
void dfs(int count,int l,int now)
{
int i;
if(count==3)
{
ok=1;
return ;
}
if(l==sum)
{
dfs(count+1,0,0);
if(ok)
return ;
}
for(i=now;i<m;i++)
{
if(!vis[i] && l+a[i]<=sum)
{
vis[i]=1;
dfs(count,l+a[i],i+1);
if(ok)
return;
vis[i]=0;
}
}
}
int main()
{
int i,j,t;
scanf("%d",&n);
while(n--)
{
sum=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",a+i);
sum+=a[i];
}
if(sum%4!=0 || m<4)
{
printf("no\n");
continue;
}
for(i=0;i<m-1;i++)
for(j=0;j<m-1-i;j++)
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
if(sum%4!=0 || m<4)
{
printf("no\n");
continue;
}
sum/=4;
for(i=0;i<m;i++)
if(a[i]>sum)
{
break;
}
if(i!=m)
{
printf("no\n");
continue;
}
ok=0;
memset(vis,0,sizeof(vis));
dfs(0,0,0);
if(ok)
printf("yes\n");
else
printf("no\n");
}
return 0;
}