Leetcode:Combination Sum
2014-06-18 21:36
435 查看
Description:
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set
A solution set is:
分析: 一个没有重复的集合,一个目标,怎么选取集合中的元素使其和为目标值,元素可以重复选取,这就是这道题的主要意思。这道和一个经典题目其实是
一个意思: 硬币总共有1,2,5,10,50的面值,问要凑出某某总额,有多少种方法? 这道题目更强,不仅要知道多少种,还要返回所有组合数目。
这道题目算是典型的深搜,先将集合排序,然后按照从小到大的元素来选取,当一个元素选取过了就不再选取了。 一个元素可以选取的次数从0到不大于目标值。
这道题目设置上要保证所有元素都大于0,因为如果有元素小于0,则无法设置终止条件,因为正元素就可以取无限次,因为有负数的存在!
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set
2,3,6,7and target
7,
A solution set is:
[7]
[2, 2, 3]
分析: 一个没有重复的集合,一个目标,怎么选取集合中的元素使其和为目标值,元素可以重复选取,这就是这道题的主要意思。这道和一个经典题目其实是
一个意思: 硬币总共有1,2,5,10,50的面值,问要凑出某某总额,有多少种方法? 这道题目更强,不仅要知道多少种,还要返回所有组合数目。
这道题目算是典型的深搜,先将集合排序,然后按照从小到大的元素来选取,当一个元素选取过了就不再选取了。 一个元素可以选取的次数从0到不大于目标值。
这道题目设置上要保证所有元素都大于0,因为如果有元素小于0,则无法设置终止条件,因为正元素就可以取无限次,因为有负数的存在!
class Solution { public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { sort(candidates.begin(),candidates.end()); findcomb(candidates,target, 0); return result; } void findcomb(vector<int>& data, int target,int use) { if(target==0) { result.push_back(onesample); return; } if(use==data.size()) return; int nowvalue = data[use]; int time = target/nowvalue; vector<int> record; for(int i=0;i<=time;i++) { record = onesample; for(int j=1;j<=i;j++) { onesample.push_back(nowvalue); } findcomb(data,target-i*nowvalue,use+1); onesample = record; } } private: vector<int> onesample; vector<vector<int> >result; };
相关文章推荐
- 【数据结构与算法】【leetcode】sum2 sum3 sum4 Combination Sum
- LeetCode - Combination Sum
- 【Leetcode】【Medium】Combination Sum
- 【LeetCode】Combination Sum
- leetcode 39 Combination Sum (回溯法)
- leetcode第38题--Combination Sum
- LeetCode: Combination Sum
- Combination Sum -- LeetCode
- ***(leetcode_backtracking) Combination Sum
- [leetcode]Combination Sum
- leetcode笔记:Combination Sum
- [Leetcode] Combination Sum
- LeetCode_39 Combination Sum
- LeetCode:Combination Sum
- [LeetCode] Combination Sum
- leetcode:combination sum
- 【LeetCode】Combination Sum
- leetcode:Combination Sum
- [LeetCode]题解(python):039-Combination Sum
- LeetCode--Combination Sum