class Solution {
private:
int cur_num = 0;
vector<int> cur_path;
vector<vector<int>> res;
public:
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
sort(num.begin(), num.end());
int n = num.size();
vector<int> vis(n, 0);
dfs(num, vis, target, 0);
return res;
}
void dfs(vector<int> &num, vector<int> &vis, int target, int cur_i){
if(cur_num == target){
res.push_back(cur_path);
return;
}
if(cur_num > target){
return;
}
for(int i=cur_i; i<num.size(); i++){
if(vis[i] == 1){
continue;
}
if(i>0 && num[i] == num[i-1] && vis[i-1] == 0){
continue;
}
cur_num += num[i];
cur_path.push_back(num[i]);
vis[i] = 1;
dfs(num, vis, target, i+1);
cur_num -= num[i];
vis[i] = 0;
cur_path.pop_back();
}
}
};