这个题很好,要剪枝;
题意;用这n个木棒是否可以摆成一个正方形;
用搜索做的思路;
利用回朔法来找 使一个或几个棒的长度之和等于正方形的边长;
当满足时s+1,s代表找到满足边长的个数,只要s==4,即已经找到完,可以结束了;
同时都清零,s+1;否则的话,s不变,len+map,i+1,继续搜索;
另外注意优化,只要flag=1;
便可以结束了;
#include"stdio.h"
#include"string.h"
int map[20];
int visit[20];
int n,flag,sum;
void bfs(int s,int len,int k)
{
int i;
if(s==4)
{
flag=1;
return ;
}
if(flag)
return;
for(i=k;i<n;i++)
{
if(visit[i]==0&&len+map[i]==sum)
{
visit[i]=1;
bfs(s+1,0,0);
if(flag)
return ;
visit[i]=0;
}
if(visit[i]==0&&len+map[i]<sum)
{
visit[i]=1;
bfs(s,len+map[i],i+1);//这里不是k+1;
if(flag)
return ;
visit[i]=0;
}
}
}
int main()
{
int i,k;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
memset(visit,0,sizeof(visit));
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&map[i]);
sum+=map[i];
}
if(sum%4)
{
printf("no\n");
continue;
}
sum=sum/4;
for(i=0;i<n;i++)
if(map[i]>sum)
break;
if(i!=n)
{
printf("no\n");
continue;
}
flag=0;
bfs(1,0,0);
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}