题意:给定整数N代表案例的次数,输入整数M代表木棍数量,然后给出许多木棍的长度,问这些木棍能否拼出个正方形。
思路:深搜+简单的剪枝。木棍总长度如果不能被4整除,或者最长的比木棍总长度除以4还要大,那么肯定拼不成正方形。把木棍的长度按降序排列,然后进行深搜。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[25],vis[25]={0},t,len,flag;
int cmp(int a,int b)
{
return a>b;
}
void dfs(int i,int s,int edge)
{
if(edge==3) {flag=1;return;}
int j;
for(j=i;j<t&&!flag;j++)
{
if(s+a[j]<=len&&!vis[j])
{
vis[j]=1;
if(s+a[j]==len) {dfs(0,0,edge+1);vis[j]=0;}
else
{
dfs(j+1,s+a[j],edge);
vis[j]=0;
}
}
}
}
int main()
{
int n,sum,i;
scanf("%d",&n);
while(n--)
{
//memset(vis,0,sizeof(vis));
flag=0;sum=0;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
len=sum/4;
sort(a,a+t,cmp);
if(a[0]>len||sum%4!=0)
{
printf("no\n");
continue;
}
else
{
dfs(0,0,0);
if(flag==1) printf("yes\n");
else printf("no\n");
}
}
return 0;
}