题目大意
给定正整数n和x,问最少需要几次乘除法可以得到x的n次方,每次可以乘上之前乘过的数
分析
运用迭代深搜,迭代深搜适用于那些所求值不大的情况给定的样例答案不大时应当考虑
上代码
/*
理解错误:
这个题目应该用广搜或者迭代深搜;
对于每一步来说,操作的步骤只有加+1或-1;
不是很懂;
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int ans[100];
bool dfs(int d,int maxd)
{
if (ans[d] == n) return true;
if (d == maxd) return false;
int maxv = ans[0];
for (int i = 1; i <= d; i++)maxv = max(maxv, ans[i]);//找出之前的最大值,用来写启发式函数
if ((maxv << (maxd - d)) < n) return false;//如果之后的全取最大值仍然小于n,则返回假
for (int i = d; i >= 0; i--) {
ans[d + 1] = ans[d] + ans[i];
if (dfs(d + 1, maxd)) return true;
ans[d + 1] = ans[d] - ans[i];
if (dfs(d + 1, maxd)) return true;
}
return false;
}
int main()
{
while (cin >> n && n) {
if (n == 1) {
cout << 0 << endl;
}
else {
ans[0] = 1;
int anss;
for (anss = 1;; anss++)
if (dfs(0, anss)) break;
cout << anss << endl;
}
}
return 0;
}