题目背景
狗哥又趁着语文课干些无聊的事了...题目描述
现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢?
输入输出格式
输入格式:
输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据。 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度。
输出格式:
对于每组测试数据,如果可以组成正方形输出“yes”,否则输出“no”。
输入输出样例
输入样例#1:
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
输出样例#1:
yes no yes
说明
狗哥快抓狂了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(↑这个说明……)
和上面一道是一样的(或者更简单?),看到了就一并做了~
剪枝明显没有那一道多,因为题简单了嘛~
因为||写成了&&,而且maxx没有更新,检查了好长时间啊……
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define max(u,v) u>v ? u:v
int t,n,a[21],tot,maxx,k;
bool b[21];
bool dfs(int u,int v)
{
if(u==tot && v==3) return 1;
if(u==tot) v++,u=0;
for(int i=1;i<=n;i++)
if(!b[i] && (a[i]+u)<=tot)
{
b[i]=1;if(dfs(a[i]+u,v)) return 1;b[i]=0;
}
return 0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(b,0,sizeof(b));
tot=0;k=1;maxx=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),tot+=a[i],maxx=max(maxx,a[i]);
if((tot%4)!=0 || maxx>(tot/4)) printf("no\n"),k=0;tot/=4;
sort(a+1,a+n+1);
if(k)
{
if(dfs(0,0)) printf("yes\n");
else printf("no\n");
}
}
return 0;
}