题目:给你一堆木条,然后让你通过头尾相接的方式让其组成一个正方形,问你是否有这样的可能性
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1909
先判断是否能整除4,能的话,再用dfs暴力搜索 搜索到一个边之后,再搜索另一个边,搜索完第3个边之后就可以已经组成正方形了
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <list>
#define LL long long
#define INF 0x7fffffff
#define FIN 0x80000000
using namespace std;
int n;
int num[22],vis[22];
//pos递归的位置 cnt是已经搜索到的正方形边的个数 len是正在搜索的边的当前长度 lay是正方形的目标长度
bool dfs(int pos,int cnt,int len,int lay)
{
if(cnt==3) return true;
if(len==lay) return dfs(0,cnt+1,0,lay); //搜索到一个边,接着从头再搜索下一个边
for(int i=pos; i<n; i++)
{
if(vis[i]) continue;
if(len+num[i]>lay) continue; //剪枝
vis[i]=1;
if(dfs(i+1,cnt,len+num[i],lay)) return true;
vis[i]=0;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int sum=0;
for(int i=0; i<n; i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
if(sum%4)// 不能整除4 则为no
{
printf("no\n");
continue;
}
sort(num,num+n);
memset(vis,0,sizeof(vis));
if(dfs(0,0,0,sum/4)) printf("yes\n");
else printf("no\n");
}
}