POJ_2362
在有了POJ_1011的基础之后,这个题目还是能够比较轻松地独立完成的。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int state[10010],st[10010],d,n,sum;
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return *q-*p;
}
int dfs(int rest,int complete,int start)
{
int i;
if(rest==0)
{
complete++;
if(complete==4)
return 1;
for(i=0;st[i]!=0;i++);
st[i]=1;
if(dfs(d-state[i],complete,i+1))
return 1;
st[i]=0;
}
else
{
for(i=start;i<n;i++)
{
if(i>0&&state[i]==state[i-1]&&!st[i-1])
continue;
if(!st[i]&&rest>=state[i])
{
st[i]=1;
if(dfs(rest-state[i],complete,i+1))
return 1;
st[i]=0;
if(rest==state[i])
break;
}
}
}
return 0;
}
int main()
{
int i,j,k,t;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&k);
state[i]=k;
sum+=k;
}
if(sum%4!=0)
{
printf("no\n");
continue;
}
qsort(state,n,sizeof(state[0]),cmp);
memset(st,0,sizeof(st));
d=sum/4;
if(dfs(d,0,0))
printf("yes\n");
else
printf("no\n");
}
return 0;
}