在进行dfs时,有时候答案所在的层数不大,但是因为深搜而搜索多余的层数。迭代加深的思想是通过逐步增大搜索层数的方法,避免过深的搜索。因为dfs的搜索过程是指数增长的的,所以搜索多次在最坏情况下不会增加时间复杂度。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int depth;
int n;
int path[N];
bool dfs(int u, int depth)
{
if(u > depth) return false;
if(path[u - 1] == n) return true;
bool st[N] = {0};
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]) continue;
st[s] = true;
path[u] = s;
if(dfs(u + 1, depth)) return true;
}
return false;
}
int main()
{
path[0] = 1;
while(cin >> n, n)
{
int depth = 1;
while(!dfs(1, depth)) depth ++;
for(int i = 0; i < depth; i ++ ) cout << path[i] << " " ;
cout << endl;
}
}