Note:
跟上一题(LeetCode39 组合总和)思路差不多,就是加了一个判断当前数用完了没
代码如下:
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>> combinationSum2(vector<int>& c, int target) {
sort(c.begin(), c.end());
dfs(c, 0, target);
return ans;
}
void dfs(vector<int> c, int p, int target){
if(target == 0){
ans.push_back(path);
return;
}
if(p == c.size()) return;
//每次递归的时候,判断一下从当前位置,还有多少个能用的数
int k = p + 1;
while(k < c.size() && c[k] == c[p]) k ++;
int cur = k - p;
for(int i = 0; c[p] * i <= target && i <= cur; i ++){
//这里要从k开始,因为和上一道题一样,要从下一个不一样的数字开始找
//当前位置这个数放几个,然后下个数放几个
//要是还k + 1,那可能在考虑的就是同一个数放几个了
dfs(c, k, target - c[p] * i);
path.push_back(c[p]);
}
for(int i = 0; c[p] * i <= target && i <= cur; i ++)
path.pop_back();
}
};