- 编程
dfs搜索剪枝
- @ 2025-12-14 19:20:34
基本剪枝技巧
考虑一个简单的选数求和问题:从一些给定的、有重复的数 中,允许选最少的几个数,使之和为一个定值 。
- 搜索顺序优化
在大部分搜索问题中,搜索树并不是完全树,这意味着有的分支浅,有的分支深,而且无论是深的分支还是浅的分支都有可能搜到结果上相同的状态,这启示我们应该先从较浅的分支探索。例如在选数求和问题中,一条可行的经验是,先排序,然后从较大的数开始试。
- 重复性剪枝
搜索过程中,如果可以判定几条分支是完全等效的,那么只需要对其中一条分支搜索即可。例如在选数问题中,对于相同的数,一旦判定其中一个不符合要求,那么之后遇到这个数就也可以跳过了。
- 最优性剪枝
常见于要求最小/最优的搜索问题中,如果当前花费的代价已经大于目前搜到的最优解,那么无论如何都不可能再得到更优的结果,因此应当停止对当前分支的搜索,立刻回溯。例如在选数求和问题中,目前凑出 需要最少的数是 个,而当前搜索已经用了 个数还未能达到 ,那么就可以回溯了。
- 可行性剪枝
如果发现分支无法到达递归边界,则应当回溯。遇到一个搜索问题,先考虑能否在搜索前通过预处理剪枝,再考虑搜索时如何检查能否到达递归边界。例如在选数求和问题中,如果存在一些数大于 ,那么应当将这些数排除。在搜索时,如果发现当前和已经大于 或当前和加上之后数的和仍然小于 ,则应当回溯。
题目
因为sanhai_oj几乎没有题目,所以以下题目来自luogu。
希望sanhai_oj可以做得更好,拥有更多的题目。
0 条评论
目前还没有评论...