HDU4277 USACO ORZ

  原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4277

  水搜索也不会,说明自己真心水。

  直接dfs,对于每条rail,分别可以放到三条边a,b,c,复杂度3^15,最后判重和a+b>c条件,毫无剪枝可过。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <set>
 4 
 5 using namespace std;
 6 
 7 int n;
 8 int v[20], sum[20];
 9 set<int> s;
10 
11 void dfs(int d, int a, int b, int c)
12 {
13     if(d == n + 1)
14     {
15         if(c >= a && c >= b  && b >= a && a + b > c && a && b && c)
16             s.insert(a + b * sum[n] + c * sum[n] * sum[n]); 
17         return ;
18     }
19     dfs(d + 1, a + v[d], b, c);
20     dfs(d + 1, a, b + v[d], c);
21     dfs(d + 1, a, b, c + v[d]);
22 }
23 
24 int main()
25 {
26     int t, i, a, b, c;
27     scanf("%d", &t);
28     while(t --)
29     {
30         s.clear();
31         scanf("%d", &n);
32         for(i = 1; i <= n; i ++)
33         {
34             scanf("%d", &v[i]);
35             sum[i] = sum[i - 1] + v[i];
36         }
37         a = b = c = 0;
38         dfs(1, a, b, c);
39         printf("%d\n", s.size());
40     }
41     return 0;
42 }
posted @ 2012-09-18 23:44  芒果布丁  阅读(138)  评论(0编辑  收藏  举报