dfs
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,len,sum;
int stick[30],vis[30];
bool cmp(int a,int b) { return a>b;}
int dfs(int i,int rest,int trest)
{
if(trest==len) { return 1;}
for(int j=i;j<n;j++)
{
if(stick[j]<=rest&&vis[j]==0)
{
vis[j]=1;
if(stick[j]==rest)
{
if(dfs(0,len,trest-stick[j])) return 1;
}else if(dfs(j+1,rest-stick[j],trest-stick[j])) return 1;
vis[j]=0;
}
//while(stick[j]==stick[j+1]) j++;
//if(stick[j]==rest) return 0;
//if(rest==len) return 0;
if(trest==sum) return 0;
}
return 0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
}
sort(stick,stick+n,cmp);
len=sum/4;
if(sum%4!=0||stick[0]>len) {printf("no\n"); continue;}
if(dfs(0,len,sum)==1)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
poj 2362 Square
最新推荐文章于 2018-12-20 11:21:39 发布