此题同我的另一篇文章1011,思路想法基本相同,不再赘述,我的代码就是在1011的基础上做了小小的一些满足题意的改变,然后提交便AC了,但时间性能很差,我也不想再做了,留着以后再做修改吧,提高性能!
【题意简述】:给你M根小棍,让你用这些小棍拼成一个正方形。
【思 路】:同1011,做简单的适应题意改变!可以看1011。
/* 220K 1250Ms */
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 22
int N,M,aim,a[maxn];
bool visited[maxn];
int cmp(int x,int y)
{
if(x>y) return 1;
else return 0;
}
//从start根木棒出发,在已经凑齐pnum条边,
//第pnum+1条边已有pre长度的情况下,搜索是否存在满足答案的解
bool dfs(int start,int pnum,int pre)
{
if(pnum==3&&pre==aim)
return true;
if(pre==aim)
{
pnum++;
pre=0;
start =0;
}
int i;
for(i=start;i<M;i++)
{
if(visited[i]==false)
{
visited[i]=true;
if(dfs(i+1,pnum,pre+a[i]))
return true;
visited[i]=false;
}
}
return false;
}
int main()
{
cin>>N;
while(N--)
{
int sum=0;
int i;
cin>>M;
for(i=0;i<M;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a,a+M,cmp);
if(sum%4!=0)
printf("no\n");
if(sum%4==0)
{
aim = sum/4;
memset(visited,false,sizeof(visited));
if(dfs(0,0,0)){
printf("yes\n");
}
else{
printf("no\n");
}
}
}
return 0;
}