#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; }
HDU-1518-square
最新推荐文章于 2019-05-16 20:54:48 发布