链接:点击打开链接
题意:就用用给你的那些数,可以几个数相加构成一条边,看可不可以组成一个正方形。
思路:把所有的数相加起来除以4,这就是正方形的边长,如果这个数比这里所有的数的最大数还要小和不能被4整除,就肯定不能构成正方形。然后根据这个边长去深搜,找到4个,就说明可以够成正方形。不过根据题意是所有的数都要用到,所以我们应该最后判断一下所有的数是否被用到,因为可以不用到所有的数就可以找到四个相加与边长相等的数。这里是没有判断,但A啦。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,sum,num;
int a[30];
bool vis[30],ok;
int cmp(int a,int b){
return a<b;
}
void dfs(int x,int y,int z){
int i;
if(x==num){
z++;
if(z==4){
ok=true;
return;
}
x=0,y=0;
}
if(ok)
return;
for(i=y;i<m;i++){
if(!vis[i]){
if(x+a[i]>num)
continue;
vis[i]=true;
dfs(x+a[i],i,z);
vis[i]=false;
}
}
}
int main(){
int i,max;
scanf("%d",&n);
while(n--){
sum=0;
max=0;
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d",&a[i]);
sum+=a[i];
if(max<a[i])
max=a[i];
}
if(sum%4!=0||sum/4<max)
printf("no\n");
else {
//sort(a,a+m,cmp);
num=sum/4;
memset(vis,false,sizeof(vis));
ok=false;
dfs(0,0,0);
if(ok)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}