某些分支的层数很深,但答案在很浅的位置,可以用迭代加深
dfs过程类似小猫坐车,在最大为u的情况下搜索,在u的条件下搜u+1,如果搜索成功连锁退出.
注意初始化path[0]=1
该题需要恢复现场,path[u]=s;直接覆盖掉了path[u]
#include <iostream>
#include <cstring>
using namespace std;
const int N=110;
int path[N],st[N];
int n;
int dfs(int u,int depth)
{
if(u>depth) return 0;
if(path[u-1]==n) return 1;
memset(st,0,sizeof st);
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]=1;
path[u]=s;
if(dfs(u+1,depth)) return 1;
}
}
return 0;
}
int main()
{
while(cin>>n,n)
{
int d=1;
memset(path,0,sizeof path);
//注意初始化
path[0]=1;
while(!dfs(1,d)) d++;
for(int i=0;i<d;i++)
{
cout<<path[i]<<" ";
}
cout<<endl;
}
return 0;
}