解法1:暴力DFS+剪枝
class Solution {
public:
vector<vector<int> > ans;
vector<int> one;
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
sort(num.begin(), num.end()); //排序
ans.clear();
one.clear();
dfs_find(num, 0, target, 0);
return ans;
}
void dfs_find(vector<int> &num, int k, int target, int cur){
if(target == cur){
ans.push_back(one);
return;
}
for(int i = k; i < num.size(); i++){
if(cur+num[i] > target){ //剪枝,后边的数更大,加上cur会更大于target
continue;
}
if(i>k && num[i]==num[i-1]){ //去重,num[i]用过就不能再用了,但是第一次还是能用
continue;
}
one.push_back(num[i]); //放入
dfs_find(num, i+1, target, cur+num[i]); //递归求解
one.pop_back(); //恢复
}
}
};
京公网安备 11010502036488号