UVA - 1374 - Power Calculus(迭代加深)
从小到大枚举可能的次数,然后迭代加深搜索验证
1 #include<cstdio> 2 #include<cstring> 3 #include<cctype> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostream> 7 #include<sstream> 8 #include<iterator> 9 #include<algorithm> 10 #include<string> 11 #include<vector> 12 #include<set> 13 #include<map> 14 #include<deque> 15 #include<queue> 16 #include<stack> 17 #include<list> 18 #include<ctime> 19 #define all(x) x.begin(), x.end() 20 typedef long long ll; 21 typedef unsigned long long llu; 22 const int MAXN = 1000 + 10; 23 const int MAXT = 1000 + 10; 24 const int INF = 0x7f7f7f7f; 25 const double pi = acos(-1.0); 26 const double EPS = 1e-6; 27 using namespace std; 28 29 int a[MAXN], ans, n; 30 31 bool dfs(int lur){ 32 int pre = a[lur - 1]; 33 if(lur == ans){ 34 if(pre == n) return true; 35 return false; 36 } 37 if((pre << (ans - lur)) < n) return false; 38 for(int i = 0; i < lur; ++i){ 39 a[lur] = pre + a[i]; 40 if(a[lur] <= 1000 && dfs(lur + 1)) return true; 41 a[lur] = pre - a[i]; 42 if(a[lur] > 0 && dfs(lur + 1)) return true; 43 } 44 return false; 45 } 46 47 int main(){ 48 while(scanf("%d", &n) == 1 && n){ 49 a[0] = 1; 50 for(ans = 1; !dfs(1); ++ans); 51 printf("%d\n", ans - 1); 52 } 53 return 0; 54 }

浙公网安备 33010602011771号