Power Caculus
题意:给出一个n,求最少计算几步可以得到 。
- 枚举最大次数,然后DFS判断是否可行,将到达的地方储存在数组中乘除运算。注意最大计算都无法达到 n 和已经超过 n 时需要剪枝。
- 主要看代码,注释很详细。
-
// zyc 2018/7/23 #include <bits/stdc++.h> using namespace std; const int maxn = 1e3 + 7; const int M = 1e9 + 7; int a[100], n; bool dfs (int now, int num, int steps) { // 储存已经到过的地方 a[num] = now; // 剪枝 if (num > steps) return false; if (now << (steps - num) < n) return false; // 判断条件是否符合 if (now == n || now << (steps - num) == n) return true; // 暴搜 乘或除 for (int i = 0; i <= num; i ++) { if (dfs(now + a[i], num + 1, steps)) return true; if (now - a[i] > 0 && dfs(now - a[i], num + 1, steps)) return true; } return 0; } int main () { int i; while (scanf ("%d", &n) && n!= 0) { // 枚举最大步数 for (i = 0; ; i ++) { memset (a, 0, sizeof (a)); if (dfs(1, 0, i)) break; } printf ("%d\n", i); } }