这题跟POJ1011题很像,但感觉比这题简单些。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10000],sum,m;
bool vis[10000];
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
bool dfs(int count,int s,int cur,int xu)
{
if(count==4)return true;
int ok=-1;
for(int i=cur;i<m;i++)
{
if(!vis[i]&&ok!=a[i])
{
if(s+a[i]<xu)
{
vis[i]=1;
if(dfs(count,s+a[i],i+1,xu))
return true;
vis[i]=0;ok=a[i];
}
else if(s+a[i]==xu)
{
vis[i]=1;
if(dfs(count+1,0,0,xu))
return true;
vis[i]=0;ok=a[i];
}
if(s==0)
break;
}
}
return false;
}
int main()
{
//freopen("t.txt","r",stdin);
int T,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&m);
memset(vis,0,sizeof(vis));
sum=0;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum%4==0)
{
sum/=4;
qsort(a,m,sizeof(a[0]),cmp);
if(dfs(0,0,0,sum))printf("yes\n");
else printf("no\n");
}
else printf("no\n");
}
return 0;
}