39. Combination Sum-回溯法
来源:互联网 发布:河南网络教育 编辑:程序博客网 时间:2024/05/17 08:26
Tags: backTracking(回溯法)
http://blog.csdn.net/jarvischu/article/details/16067319
http://www.cnblogs.com/chinazhangjie/archive/2010/10/22/1858410.html
http://blog.csdn.net/chinajane163/article/details/48969353
具有限界函数的深度优先生成法称为回溯法。(回溯法 = 穷举 + 剪枝)
回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。
回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。
问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。
当问题是要求满足某种性质(约束条件)的所有解或最优解时,往往使用回溯法。
它有“通用解题法”之美誉。
二. 回溯法实现 - 递归和递推(迭代)
回溯法的实现方法有两种:递归和递推(也称迭代)。一般来说,一个问题两种方法都可以实现,只是在算法效率和设计复杂度上有区别。【类比于图深度遍历的递归实现和非递归(递推)实现】
1. 递归
思路简单,设计容易,但效率低,其设计范式如下:2. 递推
算法设计相对复杂,但效率高。三. 子集树和排列树
1. 子集树
所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间成为子集树。如0-1背包问题,从所给重量、价值不同的物品中挑选几个物品放入背包,使得在满足背包不超重的情况下,背包内物品价值最大。它的解空间就是一个典型的子集树。
回溯法搜索子集树的算法范式如下:
2. 排列树
所给的问题是确定n个元素满足某种性质的排列时,相应的解空间就是排列树。如旅行售货员问题,一个售货员把几个城市旅行一遍,要求走的路程最小。它的解就是几个城市的排列,解空间就是排列树。
回溯法搜索排列树的算法范式如下:
四. 经典问题
(1)装载问题(2)0-1背包问题
(3)旅行售货员问题
(4)八皇后问题
(5)迷宫问题
(6)图的m着色问题
本题的代码:
class Solution {public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> res;vector<int> preCom;int size = candidates.size();backTracking(candidates, target, 0, preCom, res, size, 0);return res;}void backTracking(vector<int>& candidates, int target, int preSum, vector<int>& preCom, vector<vector<int>>& res, int& size, int ind){for (int i = ind; i < size; ++i){int tmp = preSum + candidates[i];if (tmp <= target){preCom.push_back(candidates[i]);if (tmp == target)res.push_back(preCom);if (tmp < target)backTracking(candidates, target, tmp, preCom, res, size, i);preCom.pop_back();}}}};
0 0
- 39. Combination Sum-回溯法
- (回溯法)LeetCode#39. Combination Sum
- 回溯法——combination-sum、combination-sum-ii
- 39.leetcode Combination Sum(medium)[递归回溯]
- Combination Sum I II III 回溯法
- [leetcode] 回溯法 Combination Sum 系列问题
- leetcode 39 Combination Sum (回溯法)
- leetcode 216 Combination Sum II (回溯法)
- 回溯法(leetcode-Combination Sum)
- [leetcode][回溯] Combination Sum
- [leetcode][回溯] Combination Sum II
- [leetcode][回溯] Combination Sum III
- Leetcode|Combination Sum III[回溯]
- leetcode---Combination Sum III---回溯
- leetcode 39. Combination Sum-回溯算法|递归|非递归
- (回溯法)LeetCode#40. Combination Sum II
- leetcode Combination Sum II回溯问题
- Leetcode|Combination Sum II[递归回溯]
- Keil MDK 下利用 printf( )的串口编程
- HTML布局
- linux下UDP的socket编程
- 详解iframe
- 设计模式(3) 工厂方法模式
- 39. Combination Sum-回溯法
- Android Picasso图片缓存框架的使用
- 关于handler的那些事
- 【开发】【开源】SmartEditorForOI
- Http协议及TCP/IP协议详解
- pxhawk软件分析之伺服控制
- 编译的原理
- Mac上安装cocoapods教程
- linux常用文本查看、操作命令