要求:跟39题区别是每个数只能用一次并且数组本身有重复
思路:回溯,先排序,用lastnum保证每轮的数不重复,用count代替visit保证重复的数都能访问到,用start保证从小到大,剪枝在注释,超过57%,,47%
class Solution {
public:
vector<vector<int>> v;
vector<int> tmp;
unordered_map<int,int> count;
void dfs(vector<int>& candidates,int &target,int sum,int start){
if(sum==target){
v.push_back(tmp);
return;
}
int lastnum=0;
for(int i=start;i<candidates.size();++i){
if(lastnum!=candidates[i]&&count[candidates[i]]!=0){
if(candidates[i]+sum>target)return;//剪枝
lastnum=candidates[i];
--count[candidates[i]];
tmp.push_back(candidates[i]);
dfs(candidates,target,sum+candidates[i],i);
++count[candidates[i]];
tmp.pop_back();
}
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
for(int i=0;i<candidates.size();++i)
++count[candidates[i]];
dfs(candidates,target,0,0);
return v;
}
};