void combinationSumHelper(vector<int> &num, int target, int i, vector<int> combination, vector<vector<int> > &result) { if (target < 0) return; if (target == 0) { if (find(result.begin(), result.end(), combination) == result.end()) result.push_back(combination); return; } if (i == num.size()) return; combinationSumHelper(num, target, i + 1, combination, result); if ( num[i] <= target ) { combination.push_back(num[i]); combinationSumHelper(num, target - num[i], i + 1, combination, result); } };
vector<vector<int> > combinationSum(vector<int> &candidates, int target) { N = candidates.size(); int buf[N]; for (int i = 0; i < N; i++) buf[i] = 0; combinationSumHelper(0, target, candidates, buf); sort(ret.begin(), ret.end()); return ret; }
vector<vector<int> > combinationSum2(vector<int> &num, int target) { vector<vector<int> > result; sort(num.begin(), num.end()); if (num[0] > target) return result; vector<int> combination; combinationSumHelper(num, target, 0, combination, result); return result; };
vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<vector<int>> v; vector<int> l; sort(candidates.begin(), candidates.end()); combinationSumHelper(&v, &l, &candidates, 0, target, 0); return v; }
vector<vector<int>> SubSetTest::combinationSum( vector<int> num, int target ) { vector<vector<int>> rst; if (num.size() == 0) { return rst; } vector<int> path; sort(num.begin(), num.end(), less<int>()); combinationSumHelper(num, target, path, 0, rst); return rst; }
void combinationSumHelper(vector<vector<int>> * v, vector<int> * l, vector<int> * candidates, int sum, int target, int i) { if (sum == target && l->size() > 0) { v->push_back(*l); return; } if (sum > target) { return; } for (int j = i; j < candidates->size(); j++) { l->push_back( (*candidates)[j] ); combinationSumHelper(v, l, candidates, sum + (*candidates)[j], target, j); l->pop_back(); } }
void combinationSumHelper(int pos, int remain, vector<int> &candidates, int buf[]) { if (remain == 0) { vector <int> tmp; for (int i = 0; i < pos; i++) { for (int j = 0; j < buf[i]; j++) { tmp.push_back(candidates[i]); } } sort(tmp.begin(), tmp.end()); ret.push_back(tmp); return; } if (pos == N) return; for (int i = 0; i <= remain / candidates[pos]; i++) { buf[pos] = i; combinationSumHelper(pos + 1, remain - i * candidates[pos], candidates, buf); } buf[pos] = 0; }
void SubSetTest::combinationSumHelper( vector<int> num, int target, vector<int> path, int pos, vector<vector<int>>& rst ) { if (target == 0) { rst.push_back(path); return; } int prev = -1; for (int i = pos; i < num.size(); i++) { if (num[i] > target) { break; } if (prev != -1 && prev == num[i]) { continue; } path.push_back(num[i]); combinationSumHelper(num, target - num[i], path, i, rst); path.pop_back(); prev = num[i]; } }