回溯和剪枝的概念
回溯算法其实是构造一棵解空间树的过程。在搜索至树中任一节点时,先判断该节点对应的部分是否是满足约束条件,或者是否超出目标函数的界,也就是判断该节点是否包含问题的最优解。
如果肯定不包含,则跳过对该节点为根的子树的搜索,即所谓的剪枝;否则,进入该节点为根的子树,继续按照深度优先策略搜索。
去重:例如求解子集的问题中,给定nums数组为1,2,2。当以1为节点的时候可以得到1,2,2的一条分支。然而另一条分支也是1,2,2。所以,在同一层上的,如果两个相邻的节点的数值相同,后面的就没必要再搜索一遍了因为和前面的节点搜索的结果是相同的。所以这条分支没有必要搜索,此为去重。去重的前提是要进行排序!
一般格式
一般现在第一个函数中做输入数据的处理,包括为空判断,合理检查等等。以及调用backtrack进行dfs的函数。
在backtrack函数中,首先要进行边界的确定,即什么时候可以返回或者添加结果了。
接着是在for循环中做递归。for循环循环的一般是分支的内容。即可以让节点进行分支的内容。
backtracking() {
if (终止条件) {
存放结果;
}
for (选择:选择列表(可以想成树中节点孩子的数量)) {
递归,处理节点;
backtracking();
回溯,撤销处理结果
}
}
未完待续...