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

题解

之前没怎么学过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*的估价函数,比如迭代加深的层数限制,都可能让程序跑得更快。所以多学点没坏处的啊~

你可能感兴趣的:(日常练习)