ZSTU-1826:Square

来源:互联网 发布:ok三连冠科比数据 编辑:程序博客网 时间:2024/05/16 03:50
/*DFS*/#include<iostream>#include<algorithm>#include<cstring>#define N 24using namespace std;int st[N],cnt,n,avg;int vis[N],flag;bool Cmp(const int &a,const int &b){return a>b;}void DFS(int cnt,int len,int c){if (cnt==3)flag = 1;//构成一个正方形if (flag)return;int i;for(i=c;i<n;i++)//枚举每一条边{if (!vis[i] && len+st[i]<=avg)//没有用过的边并且长度与下一条边之和小于边长{if (len+st[i]==avg){vis[i] = 1;DFS(cnt+1,0,0);vis[i] = 0;}else {vis[i] = 1;DFS(cnt,len+st[i],i);vis[i] = 0;} if (len==0)break;//剪支,如果构成了,前面就已经得到解。}}}int main(){int t,i,sum;cin>>t;while(t--){sum = 0;cin>>n;for(i=0;i<n;i++){cin>>st[i];sum += st[i];}sort(st,st+n,Cmp);//从长到短排序if (sum%4!=0||st[0]>sum/4)//如果最长的大于sum/4(即每条边),或者总和不能整除4,排除掉{cout<<"no"<<endl;continue;}avg = sum/4;//求所构成正方形的边长flag = 0;memset(vis,0,sizeof(vis));DFS(0,0,0);if (flag)cout<<"yes"<<endl;else cout<<"no"<<endl;}return 0;}

原创粉丝点击