HDU 4277 USACO ORZ(DFS)

题目链接

用DFS就可以过,判重的时候用map去重的,因为每一条边是最大是10000,用150000进制的3位数就可以表示出现的状态。

数据水了。。。我的代码用的是15000进制就A了。。。卡线过的1300+ms

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <cstdlib>
 6 #include <map>
 7 using namespace std;
 8 int ans,p[16],o[16],n,sum[16];
 9 map <__int64,bool> key;
10 void dfs(int x,int a,int b,int c)
11 {
12     if(x > n)
13     {
14         if(a&&b&&c&&a <= b&&b <= c&&!key[15000*15000*a+15000*b+c]&&a+b > c)
15         {
16             key[15000*15000*a+15000*b+c] = 1;
17             ans ++;
18         }
19         return ;
20     }
21     if(c + sum[x] <= b||b + sum[x] <= a||a+b+sum[x] <= c)
22         return ;
23     dfs(x+1,a+p[x],b,c);
24     dfs(x+1,a,b+p[x],c);
25     dfs(x+1,a,b,c+p[x]);
26 }
27 int main()
28 {
29     int i,t;
30     scanf("%d",&t);
31     while(t--)
32     {
33         ans = 0;
34         key.clear();
35         scanf("%d",&n);
36         for(i = 1; i <= n; i ++)
37         {
38             scanf("%d",&p[i]);
39             sum[i] = sum[i-1]+p[i];
40         }
41         dfs(1,0,0,0);
42         printf("%d\n",ans);
43     }
44     return 0;
45 }
posted @ 2012-09-21 14:45  Naix_x  阅读(118)  评论(0编辑  收藏  举报