可行性剪枝:
通过一些判断,砍掉搜索树上不必要的子树。
有时候,如果发现某个结点对应子树的状态不是我们想要的结果,那么没必要对这个分支进行搜索,砍掉这个子树,就是剪枝。
例:
n个数选k个数和为sum,如果发现当前和大于sum,那么之和不管怎么选和值都不可能是sum了
或者 如果选出数的个数大于k,那么之后不管怎么选数个数都大于k,
我们可以直接终止分支的搜索。
最优性剪枝:
在求解最优解的一类问题,通常可以用最优性剪枝
例1:
求解迷宫最短路时,如果发现当前的步数已经超过了当前最优解,那么从当前状态开始的搜索都是多余的,因为这样搜索下去永远得不到更优的解。通过这样的剪枝,可以省去大量冗余的计算
例2:
在搜索是否有可行解的过程中,一旦找到了一组可行解,后面所有的搜索都不必再进行了。
重复性剪枝:
bool类型数组vis防止选重复的节点