回溯法(Backtracking)
来源:互联网 发布:avi加密视频破解软件 编辑:程序博客网 时间:2024/06/07 10:47
回溯法的基本思想
剪枝函数
解题步骤
1.定义问题的解空间(树状结构)
2.确定易于搜索的解空间结构
3.使用递归或者迭代的方法搜索符合要求的解空间,并使用约束条件和剪枝函数避免无效的搜索
算法框架
递归算法
int void BackTracking(int t) //参数t表示当前递归深度{ if(t>n) Output(x) //遍历到解,则将解输出或者其他处理,n用来控制递归深度即解空间树的高度 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[i]的第i个可选值 if(Constarint(t)&&Bound(t)) //剪枝函数、约束函数、界限函数 Backtrack(t+i); } }}
迭代算法
void BackTracking() { int a[n],i; //初始化数组a[n] i=1; while(i>0 and (expression)) //当有路可走并没有到达目标时 { if(i>n) //搜索到叶节点 { 搜索到一个解,输出; } else { a[i]第一个可能值; while(a[i]在不满足约束条件其在搜索空间之中) { a[i]下一个可能的值; } if(a[i]在搜索空间之内) { 标识使用a[i]; i=i+1; } else { 清理所占用的状态空间; i=i-1; } } }}
算法示例
0 0
- 回溯法(Backtracking)
- 回溯法(Backtracking)
- backtracking 回溯法题目总结
- 回溯法概述—BackTracking
- BackTracking回溯
- 回溯法(backtracking)解决平衡集合问题
- (Leetcode)backtracking回溯法 题目汇总
- 【数据结构与算法】backtracking 回溯法
- LeetCode 回溯算法 backtracking
- 回溯(Backtracking)
- 用回溯法(backtracking)实现数学排列和组合
- Backtracking回溯法(又称DFS,递归)全解
- 用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)
- 用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)
- 迷宫问题(MazePath)的求解——利用回溯法(backtracking)
- 回溯法(Backtracking)总结(子集,全排列,组合和,回文分割)
- 回溯算法(BackTracking)--八皇后问题
- 回溯算法(BackTracking)--八皇后问题
- 《Effective STL》学习笔记(第二部分)
- PAT1030完美数列(25)
- lintcode:Subsets
- 《Effective STL》学习笔记(第三部分)
- 【杭电oj】1874 - 畅通工程续(dijkstra,注意注意!)
- 回溯法(Backtracking)
- crash文件解析
- 数组2(笔记)
- 《Effective STL》学习笔记(第四部分)
- GDB 调试
- Item 26: 避免对universal引用进行重载
- 数组左旋转k位 std::rotate() POJ 1978
- 《Effective C++》读书笔记(第一部分)
- 输入法中的全角与半角