大意:给出N跟木棍,问是否能用这些木棍拼出一个正方形。
做法:DFS,DFS前,先判断总长度sum是否整除4,不整除直接NO。整除进行DFS判断。边长为sum/4.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[22],flag[22],sum,t;
bool DFS(int l1,int l2,int count1)//l1是一条边的边长,l2是这次可以选的棍子的起始编号,count是拼好了的边的个数。
{
if(l1 == sum)//拼好一条边,从新开始拼第二条。
{
l1 = 0;
l2 = 0;
count1++;
if(count1 == 4)//如果拼好4条边,就返回true。
return true;
}
for(int i = l2 ; i < t ; i++)
{
if(!flag[i])
{
flag[i] = true;
if(l1+a[i]<=sum&&DFS(l1+a[i],i+1,count1))
return true;
flag[i] = false;
}
}
return false;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
sum = 0;
bool flag1 = false;
memset(flag,false,sizeof(flag));
scanf("%d",&t);
for(int i = 0 ; i < t ; i ++){
scanf("%d",&a[i]);
sum += a[i];
}
if(sum%4==0)
{
sum /= 4;
flag1 = DFS(0,0,0);
}
if(flag1) printf("yes\n");
else printf("no\n");
}
return 0;
}