/*
輸入一些木棍的長度,要構成一個正方形
剪枝
1 排序,從最大的開始bfs
2 if(sum%4!=0||M<4)
{
printf("no\n");
continue;
}
3 設定每一次開始的位置
begin,注意,如果完成一條邊的時候,開始從0開始
4 中間一些木棍大小相同,如果上一次都沒有用,這一次也不會用的
if(i&&!map[i-1]&&s[i]==s[i-1])
{
continue;//當遇到兩個相同長度的棒的時候,前一個沒用,這一個可以不處理
}
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 25
int N;int M;
int s[MAX];int map[MAX];
int com(const void *a,const void *b)
{
return (*(int *)b)-(*(int *)a);
}
//第一個參數是夠4,
//第二手參數是差
int bfs(int num,int off,int side,int begin)
{
if(num==4)
{
if(off==side)
return 1;
else
return 0;
}
int i;
for(i=begin;i<M;i++)
{
if(i&&!map[i-1]&&s[i]==s[i-1])
{
continue;//當遇到兩個相同長度的棒的時候,前一個沒用,這一個可以不處理
}
//訪問過
if(map[i])
continue;
if(off-s[i]<0)
continue;
map[i]=1;
if(off-s[i]>0)
{
if(bfs(num,off-s[i],side,i+1))
{
return 1;
}
}
if(off-s[i]==0)
{
if(bfs(num+1,side,side,0))
{
return 1;
}
}
map[i]=0;
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&N);
while(N--)
{
scanf("%d",&M);
int i=0;
memset(s,0,sizeof(s));
memset(map,0,sizeof(map));
int sum=0;
for(i=0;i<M;i++)
{
scanf("%d",&s[i]);
sum+=s[i];
}
qsort(s,M,sizeof(int),com);
//如果不能被4除盡
if(sum%4!=0||M<4)
{
printf("no\n");
continue;
}
if(bfs(0,sum/4,sum/4,0))
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}