迭代加深代码
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 110;
int n;
int path[N];
bool dfs(int u, int k) // u表示当前层数, k表示最大的层数
{
if (u == k) {
return path[u - 1] == n;
}
bool st[N] = {0}; // 通过 bool数组排除等效冗余
for (int i = u - 1; i >= 0; i--) {
for (int j = i; j >= 0; j--) {
int s = path[i] + path[j];
if (s > n || s <= path[u - 1] || st[s]) { // path一定是递增的
continue;
}
st[s] = true;
path[u] = s;
if (dfs(u + 1, k)) {
return true;
}
}
}
return false;
}
int main()
{
path[0] = 1;
while (cin >> n, n) {
int k = 1;
while (!dfs(1, k)) { // 不断扩大范围
k++;
}
for (int i = 0; i < k; i++) {
cout << path[i] << " ";
}
cout << endl;
}
return 0;
}
st[N]每次迭代的时候,不是都被重新初始化为0吗?
我个人认为st其实没用,删掉也可以。
其实s <= path[u - 1]中,相等的情况,就保证了,后面的一定严格大于前面的,所以没有重复出现的情况
st对大于path[u - 1]进行剪枝,等效冗余性剪枝,比如8+10和9+9
赞
######
niu
我感觉也没用
你可以跑一下试试,时间少一半
确实快很多
为啥我的时间差不多啊,数据改了吗
很好这个理解
很容易理解,牛!!!
终于看懂了,谢谢
佬我还想问个问题哈,那此题bfs不行嘛,如果答案在浅层,为啥不直接应用bfs…我还木有想明白,现在感觉迭代加深就是深度递增的dfs
空间会不够·
采用bfs的话,queue会迅速变大,是几何级增长的,代码会MLE。之所以使用dfs+限制深度来模拟bfs,就是怕空间不足。
%%%
tql,大佬
讲的太好了
棒!
图画的不错
这是书上的图(⊙-⊙)
hh我没有书..
大佬,请问下这是哪本书
算法竞赛进阶指南