#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;
const int maxn=22;
int n;
int visited[maxn];
int dfs(int stick[],int curlen,int s,int deslen,int num)
{
if(num==4)
return 1;
for(int i=s;i<n;i++)
{
if(!visited[i])
{
visited[i]=1;
if(curlen+stick[i]==deslen)
{
if(dfs(stick,0,0,deslen,num+1))
return 1;
}
else if(curlen+stick[i]<deslen)
{
if(dfs(stick,curlen+stick[i],i,deslen,num))
return 1;
}
visited[i]=0; //这里就是回朔要注意
}
}
return 0;
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int nCase;
int stick[22];
cin>>nCase;
while(nCase--)
{
cin>>n;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>stick[i];
sum+=stick[i];
}
memset(visited,0,sizeof(visited));
sort(stick,stick+n,cmp);
/*
思路大致是这样,首先判断棍子是否能被4正除,若能,求出棍子的长度,然后在里面找起组合,
若能组成4条这样的那么就行了
*/
// copy(stick,stick+n,ostream_iterator<int>(cout,","));
if(sum%4!=0)
cout<<"no"<<endl;
else
{
if(dfs(stick,0,0,sum/4,1))
//这里stick表示棍子,curlen表示当前长度,deslen表示目标长度,num表示当前以求出的数目,若==4,则行
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
system("pause");
}
#include<iterator>
#include<algorithm>
using namespace std;
const int maxn=22;
int n;
int visited[maxn];
int dfs(int stick[],int curlen,int s,int deslen,int num)
{
if(num==4)
return 1;
for(int i=s;i<n;i++)
{
if(!visited[i])
{
visited[i]=1;
if(curlen+stick[i]==deslen)
{
if(dfs(stick,0,0,deslen,num+1))
return 1;
}
else if(curlen+stick[i]<deslen)
{
if(dfs(stick,curlen+stick[i],i,deslen,num))
return 1;
}
visited[i]=0; //这里就是回朔要注意
}
}
return 0;
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int nCase;
int stick[22];
cin>>nCase;
while(nCase--)
{
cin>>n;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>stick[i];
sum+=stick[i];
}
memset(visited,0,sizeof(visited));
sort(stick,stick+n,cmp);
/*
思路大致是这样,首先判断棍子是否能被4正除,若能,求出棍子的长度,然后在里面找起组合,
若能组成4条这样的那么就行了
*/
// copy(stick,stick+n,ostream_iterator<int>(cout,","));
if(sum%4!=0)
cout<<"no"<<endl;
else
{
if(dfs(stick,0,0,sum/4,1))
//这里stick表示棍子,curlen表示当前长度,deslen表示目标长度,num表示当前以求出的数目,若==4,则行
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
system("pause");
}