这道题和1011十分类似。只要把所有木棒分为4份即可。
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string.h>
using namespace std;
int n;
const int NUM=20;
bool visited[NUM];
int stick[NUM];
int des_len;
int cmp(const void* a,const void *b)
{
return ( *(int *)b-*(int *)a);
}
bool search(int len,int s,int num)
{
if(num==4)
return true;
int last=-1;
for(int i=s;i<n;i++)
{
if(visited[i]||stick[i]==last)
continue;
visited[i]=true;
if(len+stick[i]<des_len)
{
if(search(len+stick[i],i+1,num))
return true;
}
else if(len+stick[i]==des_len)
{
if(search(0,0,num+1))
return true;
}
visited[i]=false;
last=stick[i];
if(len==0)
return false;
}
return false;
}
int main()
{
freopen("input.txt","r",stdin);
int N;
cin>>N;
while(N--)
{
cin>>n;
memset(visited,false,sizeof(bool)*NUM);
int sum_len=0;
for(int i=0;i<n;i++)
{
cin>>stick[i];
sum_len+=stick[i];
}
qsort(stick,n,sizeof(int),cmp);
des_len=sum_len/4;
if(des_len*4==sum_len&&search(0,0,0))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}