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 }

 

你可能感兴趣的:(搜索)