首页 > 其他分享 >迭代加深

迭代加深

时间:2023-01-15 14:55:16浏览次数:56  
标签:迭代 weight int depth 加深 搜索 path

迭代加深

迭代加深是用于优化搜索的,因为dfs的过程中是选择搜索的一个分支,不断地深入,直到我们达到递归的边界时才会返回。这样的话,如果搜索树的分支比较多,但答案在比较浅的分支节点时,一旦我们选择了错误的搜索分支,我们就会在错误的分支上搜索到很深的深度从而浪费搜索的时间。而迭代加深就是为了解决这一问题,迭代加深的思想是,限制我们搜索的最大深度,当我们在当前最大深度搜索不到答案时,再增大深度继续搜索,就这样一圈一圈向外扩展,有点类似bfs,但与bfs不同的时,不会存储一层的节点,空间复杂度仍然是O(h),(h是搜索树的高度)。

加成序列

#include <iostream>
#include <cstring>

using namespace std;

const int N = 110;
int path[N], n;

bool dfs(int u, int depth)
{
    if(u > depth)   return false;
    if(path[u - 1] == n)    return true;
    bool st[N] = {0};
    int s = 0;
    for(int i = u - 1; i >= 0; -- i)
        for(int j = i; j >= 0; -- j)
        {
            s = path[i] + path[j];
            if(s > n || s < path[u - 1] || st[s])   continue;
            path[u] = s;
            //标记一下排除等效冗余,因为可能两个数的相加是一样的,这样就是虽然过程不同,但得到的序列是一样的
            //所以需要剪枝排除不必要的
            st[s] = 1;
            if(dfs(u + 1, depth))   return true;
        }

    return false;
}

int main()
{
    while(cin >> n, n)
    {
        int depth = 1;
        path[0] = 1;
        while(!dfs(1, depth)) depth ++;
        for(int i = 0; i < depth; ++ i) cout << path[i] << ' ';
        cout << endl;
    }

    return 0;
}

双向搜索

送礼物

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;

const int N = 46;

int w[N];
int weight[1 << 26], cnt = 1;
int n, m, k, ans;

//预处理前面k个物品并打表
void dfs1(int u, int s)
{
    //枚举到第k个物品,也就是终点
    if(u == k)
    {
        //将当前组合加入weight中
        weight[cnt ++] = s;
        return ;
    }
    //枚举不选择当前物品的情况
    dfs1(u + 1, s);
    //枚举选择当前物品的情况
    if((LL) s + w[u] <= m)  dfs1(u + 1, s + w[u]);
}

//后半部分搜索
void dfs2(int u, int s)
{
    //枚举到最后一个物品,搜索到终点
    if(u == n)
    {
        //在weight中查找最大的位置使weight <= m - s
        int l = 0, r = cnt - 1;
        while(l < r)
        {
            int mid = (l + r + 1) >> 1;
            if(weight[mid] <= m - s)    l = mid;
            else    r = mid - 1;
        }
        ans = max(ans, s + weight[l]);
        return;
    }

    dfs2(u + 1, s);
    if((LL)s + w[u] <= m)   dfs2(u + 1, s + w[u]);
}

int main()
{
    cin >> m >> n;
    for(int i = 0; i < n; ++ i) cin >> w[i];

    //优化一下搜索顺序
    sort(w, w + n);
    reverse(w, w + n);

    k = n / 2;
    dfs1(0, 0);

    sort(weight, weight + cnt);
    cnt = unique(weight, weight + cnt) - weight;

    dfs2(k, 0);
    cout << ans << endl;
    return 0;
}

标签:迭代,weight,int,depth,加深,搜索,path
From: https://www.cnblogs.com/cxy8/p/17053493.html

相关文章

  • Python 中的迭代器趣味实践
    1.遍历文本文件中的单词假设存在文本文件test.txt,内容如下:TheZenofPythonBeautifulisbetterthanuglySimpleisbetterthancomplex注意文件包含有空行,要求完成如......
  • 快速排序算法的递归,迭代法实现(C++)
    tags:DSAC++Sort思路分治法主要分成下面三个步骤:选定基准值(默认是数组首元素),这里称为pivot找到基准值待放置的位置(排序之后的位置),将大于基准值的元素放在基准值......
  • python的迭代对象和迭代器
    Python中迭代对象(Iterable)是非常核心的内容,今天就和大家分享一下,什么是迭代对象和迭代器.简单来说迭代就等于循环,那么迭代对象就是可以用for循环的对象.一句话记......
  • 火山引擎 DataTester 升级:降低产品上线风险,助力产品敏捷迭代
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群在企业竞争加剧的今天,精益开发和敏捷迭代已成为产品重要的竞争力。如何保障每一次Feature高......
  • 火山引擎 DataTester 升级:降低产品上线风险,助力产品敏捷迭代
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群在企业竞争加剧的今天,精益开发和敏捷迭代已成为产品重要的竞争力。如何保障每一次Feature高......
  • 火山引擎 DataTester 升级:降低产品上线风险,助力产品敏捷迭代
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群在企业竞争加剧的今天,精益开发和敏捷迭代已成为产品重要的竞争力。如何保障每一次Feature......
  • 迭代器 _知识
    //迭代器是什么//迭代器(iterator)有时又称光标(cusor)//是程序设计的软件设计模式//迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素//而又不暴露其内部的......
  • 数学建模之优化与迭代1
    大家好,我是gdut本科生一枚,本文是我的学习笔记,内容来自目前正在学习的章云教授的高等数学课程,视频来源于b站,如有侵权请联系我删除,谢谢。内容写的一般,希望这个博客能帮助大家......
  • 三大加深减淡
    1.中性灰中性灰rgb为128,128,128使用中性灰来处理人物肤色建立中性灰图层方法:法一新建一个图层将拾色器颜色调为中性灰,给新建的图层颜色填充为中性灰(ctrl+del填充背......
  • Java集合中迭代器的原理
    我们通过一个小案例进行分析:publicclassIteratorDemo1{publicstaticvoidmain(String[]args){//创建集合对象Collection<String>c=new......