Each number in C may only be used once in the combination.
Note:
For example, given candidate set 10,1,2,7,6,1,5
and target 8
,
A solution set is:
[1, 7]
[1, 2, 5]
[2, 6]
[1, 1, 6]
class Solution { public: void comb(vector<int> &num, vector<int> &count, vector< vector<int> > &result, vector<int> &record, int target, int sum, int pos, int s) { if (sum == target) { result.push_back(vector<int>()); for (int i = 0; i < pos; ++i) result.back().push_back(record[i]); } if (pos >= record.size() || sum > target) return; for(int i = s; i < num.size(); ++i) { if (count[i] > 0) { count[i]--; record[pos] = num[i]; comb(num, count, result, record, target, sum+num[i], pos+1, i); count[i]++; } } } vector<vector<int> > combinationSum2(vector<int> &num, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function int nSize = num.size(); vector< vector<int> > result; if (nSize == 0) return result; sort(num.begin(), num.end()); vector<int> nums; nums.push_back(num[0]); vector<int> count; count.push_back(1); for(int i = 1; i < num.size(); ++i) { if (num[i] == nums.back()) ++count.back(); else { nums.push_back(num[i]); count.push_back(1); } } vector<int> record(nSize); comb(nums, count, result, record, target, 0, 0, 0); return result; } };