迭代加深——加成序列(模板题)

传送门:-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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值