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