洛谷 P2383 狗哥玩木棒
题目背景
狗哥又趁着语文课干些无聊的事了...
题目描述
现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢?
输入输出格式
输入格式:
输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据。 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度。
输出格式:
对于每组测试数据,如果可以组成正方形输出“yes”,否则输出“no”。
输入输出样例
说明
狗哥快抓狂了
思路:一个显而易见的搜索。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int m,T; int A[25]; long long sum; int cmp(int x,int y){ return x>y; } bool dfs(int now,long long a,long long b,long long c,long long d){ if(now==m+1){ if(a==b&&b==c&&c==d&&a==sum) return true; } if(a>sum||b>sum||c>sum||d>sum) return false; if(dfs(now+1,a+A[now],b,c,d)) return true; if(dfs(now+1,a,b+A[now],c,d)) return true; if(dfs(now+1,a,b,c+A[now],d)) return true; if(dfs(now+1,a,b,c,d+A[now])) return true; return false; } int main(){ cin>>T; while(T--){ cin>>m;sum=0; for(int i=1;i<=m;i++){ cin>>A[i];sum+=A[i]; } if(sum%4){ cout<<"no"<<endl;continue; } else sum/=4; sort(A+1,A+1+m,cmp); if(dfs(1,0,0,0,0)) cout<<"yes"<<endl; else cout<<"no"<<endl; } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。