class Solution {
public:
vector<vector<int> > ret;
vector<int> sln;
void DFS(vector<int> &nums, int target, int n) {
if (target == 0) {
ret.push_back(sln);
return;
}
if (target < 0 || n == nums.size()) return;
int num = nums[n];
for (int i = 0; i * num <= target; i++) {
for (int j = 0; j < i; j++)
sln.push_back(num);
DFS(nums, target - i * num, n + 1);
for (int j = 0; j < i; j++)
sln.pop_back();
}
}
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ret.clear();
sort(candidates.begin(), candidates.end());
DFS(candidates, target, 0);
return ret;
}
};
Small Case: 12ms
Large Case: 80ms