dfs
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int m,SUM,l;
int a[27],vis[27];
int dfs(int pos,int sum_1,int num)
{
if(num==3) return 1;//如果都构成3边了,那么最后一边是肯定构成的
for(int i=pos;i>=1;i--)
{
if(vis[i]!=1)
{
vis[i]=1;//标记
if(sum_1+a[i]<l)
{
if(dfs(i-1,sum_1+a[i],num)) return 1;//小于边长,继续搜索
}
else
{
if(sum_1+a[i]==l)
if(dfs(m,0,num+1))//构成一边,从头搜索
return 1;
}
vis[i]=0;//回溯
}
}
return 0;
}
int main()
{
freopen("in","r",stdin);
freopen("out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
SUM=0;
memset(vis,0,sizeof(vis));
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
SUM+=a[i];
}
l=SUM/4;
sort(a+1,a+1+m);//降序排序
if(l<a[m]||m<4||l*4!=SUM)//退出条件,节省时间复杂度
{
printf("no\n");
// continue;
}
else if(dfs(m,0,0)) printf("yes\n");
else printf("no\n");
}
return 0;
}