Combination Sum
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,7 and target 7,
A solution set is:
[7]
[2, 2, 3]
/*
* Solution.cpp
* Description: Leetcode - combination sum I
* Created on: 2018年1月11日
* Author: wangyichen
*/
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
vector< vector<int> > combinationSum(vector<int> candidates, int target) {
vector< vector<int> > res;
vector<int> combination;
//1. sort candidate numbers via ascending-order.
sortCandidates(candidates);
//2. find combinations starts from using smallest candidate number.
combinationSumRecur(candidates, res, combination, target, 0);
//3. return result.
return res;
}
private:
void combinationSumRecur(vector<int> candidates, vector< vector<int> > &res,
vector<int> &combination,int target, int start) {
// when target=0, it means original target sum value has been met.
if (!target){
res.push_back(combination);
return;
}
// candidates[i]<=target:
// if current candidiate number is greater than current needed value,
// it'll be impossible to meet the current target value using the remained numbers.
for (int i=0; i<candidates.size() && candidates[i]<=target; i++){
combination.push_back(candidates[i]);
combinationSumRecur(candidates, res, combination, target - candidates[i], i);
combination.pop_back();
}
}
void sortCandidates(vector<int> candidates) {
sort(candidates.begin(), candidates.end());
}
};
// test
int main() {
Solution s;
// initialize vector via existed array:
// vector<int> v(arr, arr+sizeof(arr)/sizeof(arr[0]));
int candidatesList[] = {2,3,4,5,6,7};
vector<int> candidates(candidatesList,
candidatesList+sizeof(candidatesList)/sizeof(candidatesList[0]));
int target = 7;
vector< vector<int> > res = s.combinationSum(candidates, target);
for (int i=0; i<res.size(); i++){
for (int j=0; j<res[i].size();j++){
cout<<res[i][j]<<endl;
}
}
}