题意:
一开始给一个x ;
你可以用已经有的数字乘或除,要求步骤最少,得到x的n次方;
思路:
迭代深搜,从假设只移一次,一直往多了加;知道成功;
有一个剪枝,就是剩下的都加最大的,也达不到的话就返回;
#include<cstdio>
#include<cstring>
const int N = 1005;
int s[N],n,d;
bool dfs(int cur) {
int pre = s[cur - 1];
if(cur == d) {
if(pre == n)
return true;
return false;
}
if(pre << (d - cur) < n)
return false;
for(int i = 0; i < cur; i++) {
s[cur] = s[i] + pre;
if(s[cur] <= 1000 && dfs(cur + 1))
return true;
s[cur] = pre - s[i];
if(s[cur] > 0 && dfs(cur + 1))
return true;
}
return false;
}
int main() {
while(scanf("%d",&n) && n) {
s[0] = 1;
d = 1;
while(!dfs(1)) d++;
printf("%d\n",d - 1);
}
}