http://acm.hdu.edu.cn/showproblem.php?pid=1518
DFS 开始的时候回朔问题没有考虑清楚
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int stick[22];
int k[22];
int n,sum,average,temp;
int cmp ( const void *a , const void *b )
{
return *(int *)b - *(int *)a;
}
void dfs(int numbers,int sticks,int real_time_sum)
{
int i;
if(sticks==3)
{
temp=1;
return;
}
for(i=numbers;i<n&&!temp;i++)
{
if(k[i]==0)
{
k[i]=1;
if(real_time_sum + stick[i] == average)
{
dfs(0, sticks + 1, 0);
}
else if(real_time_sum + stick[i] < average)
{
dfs(i+1,sticks, real_time_sum + stick[i]);
}
k[i]=0;
}
}
return;
}
void main()
{
int t,max,i;
scanf("%d",&t);
while(t--)
{
memset(stick,0,sizeof(stick));
memset(k,0,sizeof(k));
scanf("%d",&n);
sum=0;
max=0;
for(i=0;i<n;i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
if(stick[i]>max)
max=stick[i];
}
if(sum%4||sum/4<max)
{
printf("no\n");
continue;
}
average=sum/4;
qsort(stick,n,sizeof(stick[0]),cmp);
temp=0;dfs(0,0,0);
if(temp)
printf("yes\n");
else
printf("no\n");
}
}