/*DFS*/
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 24
using namespace std;
int st[N],cnt,n,avg;
int vis[N],flag;
bool Cmp(const int &a,const int &b)
{
return a>b;
}
void DFS(int cnt,int len,int c)
{
if (cnt==3)flag = 1; //构成一个正方形
if (flag)return;
int i;
for(i=c;i<n;i++)//枚举每一条边
{
if (!vis[i] && len+st[i]<=avg)//没有用过的边并且长度与下一条边之和小于边长
{
if (len+st[i]==avg)
{
vis[i] = 1;
DFS(cnt+1,0,0);
vis[i] = 0;
}
else
{
vis[i] = 1;
DFS(cnt,len+st[i],i);
vis[i] = 0;
}
if (len==0)break; //剪支,如果构成了,前面就已经得到解。
}
}
}
int main()
{
int t,i,sum;
cin>>t;
while(t--)
{
sum = 0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>st[i];
sum += st[i];
}
sort(st,st+n,Cmp);//从长到短排序
if (sum%4!=0||st[0]>sum/4) //如果最长的大于sum/4(即每条边),或者总和不能整除4,排除掉
{
cout<<"no"<<endl;
continue;
}
avg = sum/4;//求所构成正方形的边长
flag = 0;
memset(vis,0,sizeof(vis));
DFS(0,0,0);
if (flag)
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
ZSTU-1826:Square
最新推荐文章于 2020-02-15 13:48:37 发布