挺简单的搜索,只是当时没能分析出题
注意剪枝优化
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int s[22];
bool used[22];
int sum;
int len;
bool dfs(int step,int pos,int l){
if(step==3){//剪枝之后找到三条边即可判true;
return true;
}
for(int i=pos;i>=0;i--){
if(!used[i]){
used[i]=true;
l+=s[i];
if(l==len)if(dfs(step+1,m-1,0))return true;
if(l<len)if(dfs(step,i-1,l))return true;
used[i]=false;
l-=s[i];
}
}
return false;//不能缺失!!
}
void f(){
cin>>m;
int i;
sum=0;
for(i=0;i<m;i++){
cin>>s[i];
sum+=s[i];
used[i]=false;
}
sort(s,s+m);//默认从小到大哦
//for(int i=0;i<m;i++)cout<<s[i]<<" ";
len=sum/4;
if(len*4!=sum||m<4||s[m-1]>len){
cout<<"no"<<endl;
return;
}
else{
if(dfs(0,m-1,0))cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}
int main(){
cin>>n;
while(n--){
f();
}
//memset(shuzuming,0,sizeof)
return 0;
}