传送门:-170. 加成序列 - AcWing题库
思路:迭代加深的做法有点像宽搜,只不过这里的每一次增加搜索深度都要把前面走过的路再走一遍,不知为何,我一直在恐惧这些花里胡哨的搜索方式,知道今天的一次乐跑过后,心中的迷雾散开,原来这些题目都这么简单,只是模板级别的题目而已。
言归正传,这种限制深度的深搜通常可以应用在一些可以明确答案就在深度不深的位置当中的深搜题当中,如果按照普通的深搜的话有可能每一次答案都要遍历完前面的所有搜索树枝叶才能找到。
在这道题目里面,范围特别小,哪怕是1,2,4,8,16,32,64,128,10次以内就能逼近n了。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<deque>
#define x first
#define y second
using namespace std;
typedef pair<int,int >PII;
const int N=110;
int n;
int p[N];
bool dfs(int u,int k)
{
if(u-1==k) return p[u-1]==n;
bool st[N]={0}; //为什么要在这里加一个 st数组呢?
for(int i=u-1;i>=0;i--)
for(int j=i;j>=0;j--)
{
int s=p[i]+p[j];
if(st[s]||s<=p[u-1]||s>n) continue;
st[s]=true;
p[u]=s;
if(dfs(u+1,k)) return true;
}
return false;
}
int main()
{
p[1]=1;
while(cin>>n,n)
{
int k=1;
while(!dfs(2,k))
{
k++;
}
for(int i=1;i<=k;i++) printf("%d ",p[i]);
cout<<endl;
}
return 0;
}