Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

 http://acm.hdu.edu.cn/showproblem.php?pid=1518

dfs+剪枝

我的代码
 1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 const int N=25;
5 int a[N],ans,ave,n;
6 bool vis[N];
7 int cmp(const void *a,const void *b)
8 {
9 return *(int*)b - *(int*)a;
10 }
11 void dfs(int s,int p,int k)
12 {
13 if (ans) return;
14 if (k>4) ans=1;
15 int i;
16 for (i=p+1;i<=n;i++) if (!vis[i])
17 {
18 vis[i]=1;
19 if (s+a[i]==ave) dfs(0,0,k+1);
20 else if (s+a[i]<ave) dfs(s+a[i],i,k);
21 vis[i]=0;
22 if (s==0) break;
23 while (a[i]==a[i+1]) i++;
24 }
25 }
26 int main()
27 {
28 // freopen("data.in","r",stdin);
29 int T,s,i;
30 scanf("%d",&T);
31 while (T--)
32 {
33 s=ans=0;
34 memset(vis,0,sizeof(vis));
35 scanf("%d",&n);
36 for (i=1;i<=n;i++)
37 {
38 scanf("%d",&a[i]);
39 s+=a[i];
40 }
41 qsort(a+1,n,sizeof(a[0]),cmp);
42 if (s%4==0)
43 {
44 ave=s/4;
45 dfs(0,0,1);
46 }
47 if (ans) printf("yes\n");
48 else printf("no\n");
49 }
50 return 0;
51 }

 

posted on 2012-01-13 15:44  Qiuqiqiu  阅读(479)  评论(0编辑  收藏  举报