洛谷 P2383 狗哥玩木棒

题目背景

狗哥又趁着语文课干些无聊的事了...

题目描述

现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢?

输入输出格式

输入格式:

输入文件中的第一行是一个整数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
#include
#include
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;
}


你可能感兴趣的:(洛谷,dfs/bfs)