原题传送: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 }