解题思路
和combination-sum类似,只不过元素不能重复使用,故用一个visit数组标记已经选用了的元素,避免重复选用。
代码
class Solution {
public:
bool visit[10001];
void dfs(vector<int>num,int target,vector<vector<int>> &res,vector<int> &cur){
if(target == 0){
vector<int>tmp;
tmp.insert(tmp.end(),cur.begin(),cur.end());
sort(tmp.begin(),tmp.end());
if(find(res.begin(),res.end(),tmp) == res.end())
res.push_back(tmp);
}
for(int i = 0;i < num.size();i++){
if(target - num[i] >= 0 && visit[i] == false){
visit[i] = true;
cur.push_back(num[i]);
dfs(num,target - num[i],res,cur);
visit[i] = false;
cur.pop_back();
}
}
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
vector<vector<int>>res;
vector<int>cur;
memset(visit,false,sizeof(visit));
sort(num.begin(),num.end());
dfs(num,target,res,cur);
return res;
}