【日常练习】递增数列 【迭代加深】

本文深入探讨了迭代加深搜索算法的原理与应用,通过对比贪心算法,揭示了其在解决特定问题上的优势。文章详细介绍了如何设定搜索的深度限制,以避免深度优先搜索陷入无限循环,同时确保算法效率。

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

题解

之前没怎么学过A*,IDA*,迭代加深这些搜索算法,只知道搜索+剪枝,真是惭愧……

错误算法

因为很容易发现,在第i位上你最多能凑出2i-1大小的数,所以我们就贪心凑出小于等于给定的m的最大的那个2n,然后再去凑出m-2n ……然后用一个桶记录一下哪些数需要凑出来,最后扫一遍输出即可。

听上去似乎没什么问题,好像出几个数据试试也没什么问题?

试试30呢?

用贪心:1,2,4,6,8,14,16,30 共8个数
正解:1,2,4,8,10,20,30 共7个数

emm看来贪心没办法啦

100pts(因为不知道部分分)

考虑到这个m的范围非常小啊,最多也只有5000啊,所以答案一定不会大到哪里去。

因而这个时候我们就可以用迭代加深啦!为了避免dfs走了太深回不来了,我们限制一下每次搜索的最大层数即可。如果发现当前的最大层数过小(能凑出的最大的数都比m小)我们就把最大层数再+1继续搜,直到第一次找到答案,就可以直接输出然后exit(0)了~

总结

搜索算法虽然用得最多的就是bfs和dfs,但是在此基础上衍生出的优化剪枝是非常多的,比如A*的估价函数,比如迭代加深的层数限制,都可能让程序跑得更快。所以多学点没坏处的啊~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值