Skip to content

Latest commit

 

History

History
52 lines (47 loc) · 1.1 KB

File metadata and controls

52 lines (47 loc) · 1.1 KB

索引

回溯

算法框架

(1). 问题框架

设问题的解是一个n维向量(a1,a2, ... an) 约束条件是ai(i = 1,2,3...n)之间满足某种条件,计为f(ai)

(2). 非递归回溯框架

  int a[n], i;
  初始化数组a[];
  i = 1;
  while(i > 0(有路可走) and (未达目标)){
    if(i > n){
      搜索到一个解,输出;
    }else{
      a[i]第一个可能的解;
      while(a[i]在不满足约束条件且在搜索空间内){
        a[i]下一个可能的值;
      }
      if(a[i]在搜索空间内){
        标识占用的资源;
        i = i + 1; // 拓展下一个节点
      }else{
        清理所占用的状态空间
        i = i - 1; // 回溯
      }
    }
  }

(3). 递归的算法框架

  int a[n];
  try(int i){
    if(i > n) 输出结果;
    else{
      for(j = 下界; j <= 上界; j=j+1){ // 枚举可能的路径
        if(fun(j)){
          // 满足限界函数和约束条件
          a[i] = j ;
          try(i+1);
          回溯的清理工作比如a[i]置空
        }
      }
    }
  }

递归

剪枝技巧