HDU-1518-square
来源:互联网 发布:java物联网开发技术 编辑:程序博客网 时间:2024/04/20 11:21
#include<iostream>using namespace std;#define max(a,b) (a)>(b)?(a):(b)int a[23],sum,aver,n,maxn;bool b[23],flag;void dfs(int mysum,int count,int j){ if(mysum==aver) { count++; if(count==4) { flag=true; return ; } else mysum=0; j=0; } if(flag) return ;//一旦能围城正方形立即跳出,防止TLE for(int i=j;i<n;i++) if(!b[i]&&mysum+a[i]<=aver) { b[i]=true; dfs(mysum+a[i],count,i); b[i]=false; }}int main(){ int k,i; cin>>k; while(k--) { cin>>n; sum=0; maxn=0; flag=false; for(i=0;i<n;i++) { cin>>a[i]; maxn=max(maxn,a[i]); sum+=a[i]; } aver=sum/4; if(sum%4!=0||maxn>aver)//简单判断能不能围成一个正方形 { flag=false;} else dfs(0,0,0); if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0;}