主要是剪枝:分为总体和枝节
总体:sum%4!=0,max<sum/4
枝节:在于dfs的参数设置和条件判断,动态的判断是否进行
参考代码(参考牛人的):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[25],vist[25],m,ave,flag;
int cmp(const void *a,const void *b)
{
return (int *)b-(int *)a;
}
int dfs(int res,int sums,int cur)
{
int i;
if(sums==ave)
return 1;
for(i=cur;i<m;i++)
{
if(a[i]==a[i-1]&&!vist[i-1])//相邻的相等的前者没有加入,则这个也不行
continue;
if(!vist[i]&&a[i]<=res)
{
vist[i]=1;
if(a[i]==res)
{
if(dfs(ave,sums-a[i],0))
{
// printf("%d\n",i);
return 1;
}
}
else if(dfs(res-a[i],sums-a[i],i))
{
return 1;
}
vist[i]=0;
if(res==ave)//ave没变,则表示不存在
return 0;
}
}
return 0;
}
int main()
{
int n,i,sum;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
sum=0;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
qsort(a,m,sizeof(int),cmp);
flag=0;
ave=sum/4;
if(a[m-1]>ave||sum%4)
{
printf("no\n");
continue;
}else
{
memset(vist,0,sizeof(vist));
if(dfs(ave,sum,0))
flag=1;
}
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}