迭代加深搜索+启发式搜索

文章通过埃及分数问题介绍如何利用迭代加深搜索和启发式搜索找到最优解。在解决允许加数有限且追求最优解的问题时,传统广度优先搜索效率不高。作者提出结合迭代加深搜索,通过不断加深搜索深度并在遍历过程中设置上界,以应对无限制的变量。同时,启发式搜索用于剪枝,确保搜索效率。代码示例展示了这种方法的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OK,我也不是搞ACM的,首先对文章标题来一波直白解析:

迭代加深搜索: 从小到大枚举上线maxd,每次进出深度遍历时只考虑深度不超过maxd的结点。

启发式搜索: 一般是指在普通的搜索方法情况下,构建一个启发函数,得到启发值,然后通过启发值可以进行:
1、剪枝效果,
2、根据启发值来给安排搜索先后

OK,我们来看两个题目,试试好吧。

  • 1、埃及分数:

    在古埃及,人们使用单位分数的和(即1/a,a是自然数)来表示一切有理数,例如,2/3=1/2+1/6,但是不允许2/3=1/3+1/3,因为在加数中不允许有相同的。对于一个分数a/b,表示的方法有很多种,其中加数少的比加数多的好,如果加数个数相同,那么最小的分数越大越好。例如,19/45=1/5+1/6+1/18是最优方案。

    输入两个整数a,b(0<a<b<500),试编程计算最佳表达式。

    样例输入:

    495 499

    样例输出:

    Case 1: 495/499=1/2+1/5+1/6+1/8+1/3992+1/14970

对于这种要求最优方案的情况下,BFS是一种比较常见的措施,但是只要你思考一波,你会发现连一遍都无法遍历完,因为n是可以认为没有上限,所以此时,我们采用迭代加深搜索+启发式搜索会有一个不错的东西:

迭代加深搜索:1、maxd深度从1往后遍历,直到找到
启发式搜索:2、剪枝策略:如果当前不可能在maxd深度内完成,便直接推出

OK,我们来上代码:

public class EgyptianFraction {

    private  int dep = 1;
    private long[] d = new long[11];
    private long[] ans =new long[11];
    private boolean flag = false;


    public  void
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值