bjfu1042 拼正方形

来源:互联网 发布:java执行shell脚本 编辑:程序博客网 时间:2024/05/02 00:12

拼正方形

时间限制(C/C++):1000MS/3000MS          运行内存限制:65536KByte
总提交:126            测试通过:41

描述

给你一些木棍,让你用这些木棍在地上摆出一个正方形的轮廓。如果能摆成,输出"yes",否则输出"no"。

输入

第一行有一个正整数t表示数据组数
每组数据占一行,一行中第一个数n(4<=n<=20)表示木棍的根数,接下来的n个数字表示每个木棍的长度。

输出

如果能摆成正方形,输出"yes",否则输出"no"。

样例输入

34 1 1 1 15 10 20 30 40 508 1 7 2 6 4 4 3 5

样例输出

yesnoyes

题目来源

jhf


题目知识点:dfs

AC代码:

#include<iostream> #include<algorithm> using namespace std; const int MAXN=21; int a[MAXN]; bool vis[MAXN]; int N,ave,curlen,sum; bool cmp(const int &a, const int &b){     return a>b; } bool dfs(int step,int num){     if(num>3)         return true;     if(step>=N)          return false;     if(!vis[step]&&(a[step]+curlen)<=ave*num){         vis[step]=true;         curlen+=a[step];         if(curlen==ave*num){             if(dfs(0,num+1))                 return true;                  }          else if(dfs(step+1,num))             return true;         vis[step]=false;         curlen-=a[step];     }     return dfs(step+1,num); } bool judge(){     if(N<4||sum%4!=0)         return false;     ave=sum/4;     for(int i=0;i<N;i++)         if(a[i]>ave)             return false;     sort(a,a+N,cmp);     memset(vis,false,sizeof(vis));     curlen=0;     return dfs(0,1); }   int main(){     int T;     scanf("%d",&T);     while(T--){         scanf("%d",&N);         sum=0;         for(int i=0;i<N;i++){             scanf("%d",&a[i]);             sum+=a[i];         }         if(judge())             cout<<"yes\n";         else            cout<<"no\n";             }     system("pause");     return 0; } 

0 0
原创粉丝点击