这道题做得我很难受。。。
剪枝也都对了,思路跟大牛们基本一样,就是疯狂WA,无奈,只好把代码改成跟大牛差不多的才过。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int l[25],len,flag,n;
bool vis[25];
bool dfs(int num,int x,int L)
{
if(num==3) return true;
for(int i=x;i>=0;i--)
{
if(!vis[i])
{
vis[i]=true;
if(L+l[i]<len)
{
if(dfs(num,i-1,L+l[i]))
return true;
}
else if(L+l[i]==len)
{
if(dfs(num+1,n-1,0))
return true;
}
vis[i]=false;
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
memset(l,0,sizeof(l));
scanf("%d",&n);
int ma=0,sum=0;
for(int i=0;i<=n-1;i++)
{
scanf("%d",&l[i]);
sum+=l[i];
ma=max(ma,l[i]);
}
if(n<4)
printf("no\n");
else
{
sort(l,l+n);
len=sum/4;//printf("%lf %d\n",sum/4.0,len);
if(sum%4!=0)
printf("no\n");
else if(len<ma) printf("no\n");
else
{
if(dfs(0,n-1,0)) printf("yes\n");
else printf("no\n");
}
}
}
return 0;
}