$\huge \color{orange}{成魔之路->}$ $\huge \color{purple}{算法提高课题解}$
迭代加深思路:
1. 每次设定一个最大深度 depth,同时带有一个当前深度 u
2. 当当前深度 u 到达最大深度 depth 时,判断是否符合条件,如果不符合,depth ++;
3. 优化搜索顺序:从大到小枚举
4. 可行性剪枝:当前层的数必须大于上一层的数,同时必须不能大于目标数
5. 排除等效冗余:枚举某一层的数时,数字不要重复使用
6. 符合条件的数枚举下一层
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int path[10];
bool st[N];
bool dfs(int u,int depth)
{
//到达最大深度,判断是否符合
if(u==depth) return path[u-1]==n;
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];
//大于n或者小于等于前一个数或者该数已被用过
if(s>n||s<=path[u-1]||st[s]) continue;
//记录该数字
st[s]=true;
//把该数字赋给该层
path[u]=s;
//dfs下一层
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;
}
return 0;
}