Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
yes
no
yes
题意:
用所有的木棍判断是否能组成一个正方形
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,s[25],vis[25];
int len,f;
void dfs(int sum,int k,int cnt){
if(f)return ;
if(cnt==3){//求出第三边则不需要求第四边了
f=1;
return ;
}
for(int i=k-1;i>=0;i--){
if(vis[i])continue;
if(sum+s[i]<len){
vis[i]=1;
dfs(sum+s[i],i,cnt);
vis[i]=0;
}else if(sum+s[i]==len){
vis[i]=1;
dfs(0,n,cnt+1);
vis[i]=0;
}
}
}
int main(){
int tt;
scanf("%d",&tt);
while(tt--){
memset(vis,0,sizeof(vis));
scanf("%d",&n);
len=0;
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
len+=s[i];
}
sort(s,s+n);
//进行优化剪枝,排除一些不可能的情况
if(len!=len/4*4 || s[n-1]>len/4 || len%2){
printf("no\n");
continue;
}
f=0;
len/=4;//求出边长
dfs(0,n,0);
if(f)printf("yes\n");
else printf("no\n");
}
return 0;
}