像八皇后一样的回溯。遇到这种题还是不要害怕就好,细心+大胆尝试就可以解决。
/*
* hdu-1518
* mike-w
* 2012-5-10
* ^^^^^^^^^^^^^^^^^^^^^^^^^^
* i can only think of brute DFS
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define MAX_M 25
int f[MAX_M],tag[MAX_M];
int N,M;
int sum,edge_len;
int search(int start, int s, int cnt)
{
if(s==edge_len)
return cnt==3?1:search(0,0,cnt+1);
else
{
int i;
for(i=start;i<M;i++)
if(!tag[i] && s+f[i]<=edge_len)
{
tag[i]=1;
if(search(i+1,s+f[i],cnt))
return 1;
tag[i]=0;
}
}
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i,j,maxw;
scanf("%d",&N);
for(i=0;i<N;i++)
{
memset(tag,0,sizeof(tag));
sum=edge_len=maxw=0;
scanf("%d",&M);
for(j=0;j<M;j++)
scanf("%d",f+j),sum+=f[j],maxw=max(maxw,f[j]);
if(sum%4 || maxw>sum/4)
puts("no");
else
{
edge_len=sum/4;
if(search(0,0,1))
puts("yes");
else
puts("no");
}
}
return 0;
}
638

被折叠的 条评论
为什么被折叠?



