#include <bits/stdc++.h>
using namespace std;
/*
本题可以转化为1到n需要加减多少次等价于x到x^n乘除多少次 可以利用之前的结果
使用DFS深溢出 BFS队列溢出
使用IDDFS 指定递归深度(加减次数)
估价函数-当前*2最快的方式 若仍然到不了n 剪枝
*/
int n;
int val[1010];//记录搜索路径结果
int pos;//当前搜索位置
bool dfs(int now, int depth) {
if (now > depth)
return false;
//剪枝
if (val[pos] << (depth - now) < n)
return false;
if (val[pos] == n) return true;
pos++;
//dfs遍历每一种可能
for (int i = 0; i < pos; i++) {
val[pos] = val[pos - 1] + val[i];
if (dfs(now + 1, depth)) return true;
val[pos] = val[pos - 1] - val[i];
if (dfs(now + 1, depth)) return true;
}
pos--;
return false;
}
int main() {
int t;
while (cin >> n && n) {
int depth;
//逐步增加递归深度 防止递归过深溢出 代表加减次数
for (depth = 0;; depth++) {
pos = 0;
val[0] = 1;//初始值是1
if (dfs(0, depth))break;
}
cout << depth << endl;
}
return 0;
}
这题是例题,虽然是照着抄下来了,但还是有点不懂
下面是IDDFS的解释:
IDDFS的基本思想
-
深度优先搜索 (DFS):
- DFS从根节点开始,沿着一条路径走到最深处,然后回溯并继续探索其他路径。
- DFS使用的内存较少,因为它只需存储当前路径上的节点。
- 但是,DFS可能会陷入一个非常深的路径,特别是在无穷深的情况下(如在搜索无环图时),这会导致搜索效率低下或资源耗尽。
-
广度优先搜索 (BFS):
- BFS从根节点开始,逐层遍历,首先探索所有深度为1的节点,然后探索深度为2的节点,依此类推。
- BFS可以找到最短路径,但需要更多的内存来存储所有节点和边,特别是在搜索空间很大时。
-
IDDFS的结合:
- IDDFS通过模拟“逐层”搜索,但仍然利用DFS的低内存优势。
- 它从深度0开始执行DFS,每次递归时仅允许探索指定深度的路径。如果在当前深度没有找到目标,增加深度限制,重新执行DFS。
- 通过这种方式,IDDFS逐步增加深度限制,避免了DFS深入到非常深的路径,同时又避免了BFS的高内存消耗。
第二个需要注意的点是剪枝 在dfs中真的很重要他可以去掉不需要的路径加快速率
本题由于限制了迭代深度 所以一直*2迭代深度还没有到n 说明不行 给剪枝了。
第三个就是dfs了:
由上一次新增加的搜过结果加上自己或者之前的结果储存成新的搜索结果 一直迭代。