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;
}

  

posted on 2011-08-17 22:23  Staginner  阅读(251)  评论(0编辑  收藏  举报