回溯也可以说是暴力搜索(最多剪枝一下)。回溯是递归的副产品,只要有递归就会有回溯。
一.分类
1.组合问题
(1)按组合元素的个数
(2)按组合元素的总和
-
有重复元素
-
同一元素可以重复选(有重复元素的情况下)
(3)复杂问题(升序或降序组合等)
- 先根据思路画出树形图,然后再进行条件约束
2.排列问题
(1)全排列
(2)复杂问题
-
有重复元素,需要进行树形剪枝
3.切割问题
(1)切割回文串
4.子集问题
5.棋盘问题
一维
二维
二.模板
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}