解题思路:sum%4!=0,max<sum/4。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int a[100];
bool vis[100],flag;
int m,ave;
bool dfs(int ans,int sum,int cnt){
if(sum==ave) return true;
for(int i=cnt;i<m;i++){
if(a[i]==a[i-1]&&!vis[i-1]) continue; //相邻的相等的前者没有加入,则这个也不行
if(!vis[i]&&a[i]<=ans){ //shit !!! <
vis[i]=true;
if(a[i]==ans){
if(dfs(ave,sum-a[i],0))
return true;
}
else if(dfs(ans-a[i],sum-a[i],i))
return true;
vis[i]=false;
if(ans==ave) return false; //不存在ans
}
}
return false;
}
int main(){
int n,sum;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
sum=0;
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+m);
flag=false;
ave=sum/4;
if(a[m-1]>ave||sum%4!=0){
cout<<"no"<<endl;
continue;
}
else{
memset(vis,false,sizeof(vis));
if(dfs(ave,sum,0))
flag=true;
}
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}