通用算法:
用回溯法解体的一个显著特征是 在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根节点到当前扩展节点的路径。如果解空间树中从根结点到叶节点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))
递归回溯模板:
回溯法对解空间做深度优先搜索,因此在一般情况下可用递归函数来实现回溯法:
void Backtrack(int t) //t表示递归深度 即当前扩展节点在解空间树中的深度
{
if (t > n) output(x); // n用来控制递归深度 当t > n时表明已经到叶节点,此时输出得到的可行解x
else
for(int i = f(n, t); i <= g(n, t); i++) // f g分别表示为 在当前扩展节点处未搜索过的子树的起始编号和终止编号
{
x[t] = h(i); // h(i)表示在当前扩展节点x[t]的第i个可选值
if(Constraint(t) && Bound(t)) Backtrack(t + 1); //constraint 表示约束 bound表示界限
// 当constraint返回为true时表示 在当前扩展节点x[1 : t]的取值满足问题的约束条件,否则不满足,可剪去相应子树
//当bound返回为true时表示 在当前扩展节点x[1 : t]的取值未使得目标函数越界,还需要backtrack(t + 1)对其做进一步搜索。否则当越界时,可剪
} //在执行了算法得for循环后已搜索遍当前扩展节点的所有为搜索的子树,backtrack执行完毕,返回t - 1层继续执行,继续搜索。
}