HDOJ搜索专题之Square

题目大意:给定n个正整数,问能否分成4组,且每组的和相等。

分析:这题就是sticks那题的简化版。思路一样。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <vector>
 5 #define N 20
 6 using namespace std;
 7 vector<int> edge[4];
 8 int len[N],n,sum;
 9 char vis[N],yes;
10 int cmp(const void*a,const void*b)
11 {
12   return *(int*)b-*(int*)a;
13 }
14 void dfs(int k,int l)
15 {
16   int i;
17   if(l==sum/4)
18   {
19     dfs(k+1,0);
20     return;
21   }
22   if(k==4 && l==0)
23   {
24     yes=1;
25     return;
26   }
27   if(l==0)
28   {
29     if(k==0)  i=0;
30     else  i=edge[k-1].front()+1;
31     for(;i<n && vis[i];i++);
32     if(i<n && len[i]<=sum/4)
33     {
34       vis[i]=1;
35       edge[k].push_back(i);
36       dfs(k,len[i]);
37       edge[k].pop_back();
38       vis[i]=0;
39     }
40   }
41   else
42   {
43     for(i=edge[k].back()+1;!yes && i<n;i++)
44     {
45       if(vis[i] || len[i]+l>sum/4)  continue;
46       vis[i]=1;
47       edge[k].push_back(i);
48       dfs(k,l+len[i]);
49       edge[k].pop_back();
50       vis[i]=0;
51       if(len[i]+l==sum/4) break;
52     }
53   }
54 }
55 int main()
56 {
57   int t,i;
58   scanf("%d",&t);
59   while(t--)
60   {
61     scanf("%d",&n);
62     sum=0;
63     for(i=0;i<n;i++)  scanf("%d",&len[i]),sum+=len[i];
64     qsort(len,n,sizeof(len[0]),cmp);
65     for(i=0;i<4;i++)  edge[i].clear();
66     memset(vis,0,sizeof(vis));
67     yes=0;
68     if(sum%4==0)  dfs(0,0);
69     if(yes) puts("yes");
70     else  puts("no");
71   }
72   return 0;
73 }

 

posted @ 2012-05-18 20:14  BeatLJ  阅读(214)  评论(0编辑  收藏  举报