像八皇后一样的回溯。遇到这种题还是不要害怕就好,细心+大胆尝试就可以解决。
/* * 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; }