算法框架:
回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法。
基本思路:
若已有满足约束条件的部分解,不妨设为(x1,x2,x3,……xi),I<n,则添加x(i+1)属于s(i+2),检查 (x1,x2,……,xi,x(i+1))是否满足条件,满足了就继续添加x(i+2)、s(i+2),若所有的x(i+1)属于s(i+1)都不能得到 部分解,就去掉xi,回溯到(xi,x2,……x(i- 1)),添加那些未考察过的x1属于s1,看其是否满足约束条件,为此反复进行,直至得到解或证明无解。这个回溯法明显提高算法效率。
代码:
void backtracking (int t)
{
if (t > n) {
// 到达叶子结点,将结果输出
output (x);
}
else {
// 遍历结点t的所有子结点,即枚举t所有可能的路径
// f(n,t)=下界;g(n,t)=上界;
for (int i = f(n,t); i <= g(n,t); i ++ ) {//
x[t] = h[i];//满足界限函数和约束函数
// 如果不满足剪枝条件,则继续遍历,进入下一层
if (constraint (t) && bound (t))
backtrack (t + 1);
}
}
}