题意:给m根棍子,问用上全部的棍子能不能组成一个正方形
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,sum;
int a[25],vis[25];
int flag;
int cmp(const int x,const int y)
{
return x<y;
}
void DFS(int edge,int len,int index)
{
vis[index]=1;
if(len==sum)
{
edge++;
if(edge==4)
{
flag=1;
return;
}
len=0;
index=0;
}
for(int i=index+1;i<n;i++)
{
int tlen=len+a[i];
if(!vis[i]&&tlen<=sum)
{
DFS(edge,tlen,i);
vis[i]=0;
if(flag)
return;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum%4)
{
printf("no\n");
continue;
}
sum/=4;
sort(a,a+n,cmp);
if(a[n-1]>sum)
{
printf("no\n");
continue;
}
flag=0;
memset(vis,0,sizeof(vis));
DFS(0,a[0],0);
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}