这题要用到回溯(DFS)。不然好像很难(我没想出其他办法)。
我的解法跟网上大部分的解法差不多。
注意:
1) 要元素排序先。否则错。比如说a[]={8,7,4,3},target=11。那么target=11-8=3后很快会因为再减7变成负数,所以就被返回,结果丢失了正确的解[8,3]。排序后a[]={3,4,7,8}, target=11-3=8后不会因为减了4或7变负,所以可以找到正确解。
2) solSet可以作为全局变量,也可以作为引用传入。
3) 注意for循环里面的
dfs(candidates, i, target-candidates[i], sol, solSet);
这里的 i 还可以循环利用。因为某些元素可以出现多次。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void dfs(vector<int>& candidates, int pos, int target, vector<int>& sol, vector<vector<int> >&solSet) {
if (target<0) return;
if (target==0) {
solSet.push_back(sol);
return;
}
for (int i=pos; i<candidates.size(); ++i) {
if (candidates[i]>target) return;
sol.push_back(candidates[i]);
dfs(candidates, i, target-candidates[i], sol, solSet);
sol.pop_back();
}
}
vector<vector<int>> combinationSum(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={2,3,6,7};
vector<vector<int> > solSet;
solSet=combinationSum(candidates, 7);
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;
}