题目链接:uva 1374 - Power Calculus
题目大意:给出n,问说至少计算几步得到x^n。
解题思路:迭代深搜,枚举步数,然后深搜判断是否可行。需要优化,当当前数s按照最大方案执行后仍然小于n,则说明不可行。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int N = 3005;
int aid, tmp, v[N], rec[N], pTow[50], ans[N];
bool dfs(int d, int s) {
if (d == tmp && s == aid) return true;
if (d >= tmp || s > 1500) return false;
if (s * pTow[tmp - d] < aid) return false;
rec[d] = s; v[s] = 1;
for (int i = 0; i <= d; i++) {
int u = rec[i] + s;
if (v[u] == 0)
if (dfs(d + 1, u)) return true;
u = abs(s - rec[i]);
if (v[u] == 0)
if (dfs(d + 1, u)) return true;
}
v[s] = 0;
return false;
}
int solve() {
tmp = 0;
memset(v, 0, sizeof(v));
while (true) {
if (dfs(0, 1)) break;
tmp++;
}
return tmp;
}
void init() {
pTow[0] = 1;
for (int i = 1; i <= 31; i++) pTow[i] = pTow[i - 1] * 2;
}
int main() {
init();
while (scanf("%d", &aid) == 1 && aid) {
printf("%d\n", solve());
}
return 0;
}