进阶搜索:迭代加深搜索(IDS)埃及分数题解

花了半天时间研究一道题,发篇题解巩固一下,顺便说一下迭代加深搜索。

先来看题目:

P1763 埃及分数

首先考虑进行DFS或BFS。如果使用DFS,令搜索阶段为现在枚举到第几个数,有一个很大的问题就是很可能会无限递归下去,即一个有理数可以被分解成无数个小块,深度可能是无穷大。

如果选择BFS,令搜索状态为现在已经搜索的数,同样的问题,可能会出现状态太多,无法进行记忆化搜索,因为分解一个单位分数的取值有无穷多个,分母也可能无穷大,因此搜索树的宽度也可能无穷大。

众所周知,DFS的时间效率往往随着搜索深度的加深而呈指数级的暴涨。而传统的枝剪优化只是在避免一些不必要的搜索,即对宽度进行优化,但本质上依旧无法影响递归的深度。

对于这道题,它的递归深度可能是无限大,只对它进行枝剪是完全不够的。

这个时候,就要用到迭代加深搜索,限制它递归的深度,如果找到答案则终止递归,如果这个深度没找到就放宽限制,加深搜索。

这种一代一代逐渐加深的搜索方式,就是迭代加深搜索。

不难发现,限制深度后,整个搜索树的大小就变成有限的了:深度上,不能超过限制的深度h;每一层的宽度上,根据题意,我们上层的分数一定要大于下层。即若当前节点为,则其后代都要小于,于是,若当前深度为w,则加上它后代的和要小于,所以,要是枚举的分数小于,就没必要继续递归了。

来看代码吧:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll ans[11],st[11];
ll gcd(ll x,ll y){//欧几里得算法,不懂的可以去看看我之前的博客
    if(y==0)return x;
    else return gcd(y,x%y);
}
int dep,flag;
void dfs(ll a,ll b,int x){
    if(x>dep)//深度超出了
        return;
    if(a==1&&b>st[x-1]){//剩下1/b,找到答案,注意这里的b>st[x-1]是必要的,因为在递归的过程中可能会出现约分的情况,导致结点的单调性被破坏,要注意
        st[x]=b;
        if(!flag||st[x]<ans[x])//复制答案
            for(int i=1;i<=dep;i++)
                ans[i]=st[i];
        flag=1;
        return;
    }
    ll l=max(b/a,st[x-1]+1);//左边界,必须要大于b/a和上一层的b
    ll r=(dep-x+1)*b/a;//右边界,上面说过原理
    for(ll i=l;i<=r;i++){
        st[x]=i;
        ll gc=gcd(a*i-b,b*i);//约分用的
        dfs((a*i-b)/gc,b*i/gc,x+1);//对a/b减去当前节点1/i,继续递归。
    }
}
int main (){
    ll a,b;
    cin>>a>>b;
    ll c=gcd(a,b);
    a/=c;b/=c;st[0]=1;
    for(dep=1;dep<=10;dep++){
        dfs(a,b,1);
        if(flag){
            for(int i=1;i<=dep;i++)
                printf("%lld ",ans[i]);
            break;
        }
    }
    return 0;
}

代码中声明一个全局变量dep来限制层数,主函数中会对dep不断加一直到找到答案。

来考虑时间效率问题,前h-1层的效率为:1+n++....+<,也就是前面几层加起来也没有最后一层消耗的时间多,因此不需要担心时间被浪费。

注意:这个代码过不了洛谷的hack数据,进一步优化的策略是递归到最后两层时改用枚举求二元方程的解,可以看看别的大佬是怎么写的。

相关推荐
CC数学建模3 分钟前
2026年第十六届APMCM 亚太地区大学生数学建模竞赛(中文赛项)赛题B题:高性能芯片热管理系统的优化问题完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
爱睡懒觉的焦糖玛奇朵12 分钟前
【视觉检测之人员奔跑检测算法开发思路】
人工智能·python·深度学习·算法·yolo·视觉检测
05候补工程师17 分钟前
【408考研复习】数据结构核心笔记:字符串模式匹配与内部排序算法全解析
数据结构·经验分享·笔记·考研·算法·排序算法
阿文的代码库20 分钟前
浅谈:无向图的欧拉回路
算法
-Thinker22 分钟前
AI 算法核心原理与实现
人工智能·算法·机器学习
Eloudy23 分钟前
最小权重完美匹配(MWPM)与表面码纠错
算法·量子计算
-森屿安年-25 分钟前
62. 不同路径
算法·动态规划
学计算机的计算基37 分钟前
Codex CLI vs Claude Code 全方位对比:设计哲学与用户体验深度解析
算法
欧阳x天43 分钟前
八大排序算法(C语言实现)
数据结构·算法·排序算法
爱睡懒觉的焦糖玛奇朵1 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具Dataset Cleaner】
人工智能·python·学习·算法·yolo·音视频