题目链接

题目大意:


题意就是输入棍子的数量和每根棍子的长度,看能不能拼成正方形。




#include <bits/stdc++.h>
using namespace std;

int n,m,sum,cur;
int arr[25],vis[25];
bool fp;
bool mycmp(int a,int b){ return a>b; }

void dfs(int s,int len,int num){ //当前位置,目前长度,成功条数
if(num==4){ fp=true;return; }
if(len==cur)dfs(1,0,num+1); //如果这一轮凑够了一根木棍,那么接下来继续从第一根开始搜索
for(int i=s;i<=n;i++){
if(!vis[i] && len+arr[i]<=cur){
vis[i]=1; //当前木棍选或者不选
dfs(i+1,len+arr[i],num);
vis[i]=0;
if(fp)return; //如果已经成功,所有搜索分支全部暂停
}
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
memset(vis,0,sizeof(vis));
scanf("%d",&n);
sum=0;
for(int i=1;i<=n;i++){ scanf("%d",&arr[i]),sum+=arr[i]; }
sort(arr+1,arr+1+n,mycmp); //优化搜索顺序
cur=sum/4;
if(sum%4!=0 || cur<arr[1])puts("no");
else{
fp=false;
dfs(1,0,0);
fp?puts("yes"):puts("no");
}
}
}