这题就是Leetcode-39: Combination Sum稍微变了一下。
要注意的地方是:
1) for循环内要用i+1,如果还是用i的话,就会生成[1,1,1,1,1,1,1,1]这样的结果。
dfs(candidates, i+1, target-candidates[i], sol, solSet);
2) 因为input有重复元素,比如说两个1,所以要用set或map来去重,不然会生成两个[1,7]或两个[1,2,5]。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
set<vector<int> > s;
void dfs(vector<int>& candidates, int pos, int target, vector<int>& sol, vector<vector<int> >&solSet) {
if (target<0) return;
if (target==0) {
if (!s.count(sol))
solSet.push_back(sol);
s.insert(sol);
return;
}
for (int i=pos; i<candidates.size(); ++i) {
if (candidates[i]>target) return;
sol.push_back(candidates[i]);
dfs(candidates, i+1, target-candidates[i], sol, solSet);
sol.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int> > solSet;
vector<int> sol;
sort(candidates.begin(), candidates.end());
dfs(candidates, 0, target, sol, solSet);
return solSet;
}
int main()
{
vector<int> candidates={10, 1, 2, 7, 6, 1, 5};
vector<vector<int> > solSet;
solSet=combinationSum(candidates, 8);
for (auto it=solSet.begin(); it<solSet.end(); it++) {
cout<<"[";
for (auto it2=(*it).begin(); it2<(*it).end(); it2++)
cout<<(*it2)<<" ";
cout<<"]"<<endl;
}
return 0;
}