解决的问题
- 很难靠循环枚举解决(比如具有不确定的循环次数)
- 循环解决效率太低
- 可以用决策树表示
算法理解
回溯算法本质上是一个暴力DFS。DFS的对象是决策树。因此如果一个问题可以用决策树表示,那么可以用回溯解决。
算法过程
递归:使用函数DFS(node)
1.如果node达到终止状态,进行验证。如果可行加入解集。退出。
2.如果node未达到终止状态,执行DFS(child),child是DFS的所有孩子。
循环:使用栈
1.将第一步所有可能入栈。
2.如果栈空则退出,返回false
3.出栈,判断是否是终止状态。如果是终止状态,进行验证。如果可行加入解集。返回2
4.如果不是终止状态,则所有的孩子入栈。返回2
实现的细节
1.判断时,可能需要从顶点到终止节点的情况。此时用递归传递一个路径会比较方便
2.对于孩子的遍历顺序,可以按照一定顺序,使得找到的结果值最大。