回溯法算法思想:
回溯法在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树;
算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解;
如果肯定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯;
否则,进入该子树,继续按深度优先策略搜索。
回溯法解题模板:
针对所给问题,定义问题的解空间;
确定解空间结构;
以深度优先方式搜索解空间;
按约束条件进行剪枝。
总结递归回溯模板和迭代回溯模板:
/*递归回溯模板*/
void backtrack()
{
if(t>n) //t表示递归深度,n控制递归深度。t>n表示算法已搜索至叶节点
output(x); //记录或输出得到的可行解x
else
{
//f(n,t)和g(n,t)分别表示在当前扩展结点处未搜索过的子树的起止编号和终止编号
for(int i=f(n,t);i<=g(n,t),i++)
{
x[t]=h(i); //h(i)表示在当前扩展结点处x[t]的第i个可选值
if(constraint(t) && bount(t)) //当前扩展结点处的约束函数和限界函数
backtrack(t+1);
}
}
}
/*迭代回溯模板*/
void iterativeBacktrack()
{
int i=1;
while(t>0)
{
if(f(n,t)<=g(n,t))
{
for(int i=f(n,t);i<=g(n,t);i++)
{
x[t]=h(i);
if(constraint(t)