给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30

class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
bool st[110];
vector<vector<int>> combinationSum2(vector<int>& num, int target) {
sort(num.begin(), num.end());
dfs(num, target, 0);
return ans;
}
void dfs(vector<int>& num, int target, int cur){
if(target == 0){
ans.push_back(path);
return;
}
if(cur == num.size()) return;
for(int i = cur; i < num.size(); i++){
int a = num[i];
if(target - a < 0) return;//减枝,去掉不必要的枚举
path.push_back(a);
dfs(num, target-a, i+1);//i+1去重,从当前位置的下一个位置开始深搜
path.pop_back();
// 去重,去掉同一层级中,相同数字的深搜
while(i < num.size() && num[i] == a) i++;
i--;
}
}
};