思路:回溯搜索,先对数组排好序,然后从前往后搜索,记录当前已经累加的和当前已经加进来的元素。如果当前和已经等于目标值,加入到解中间去,如果大于目标值,回溯(因为已经排好序,不需要再搜索后面更大的元素),如果小,则加入当前元素(保证重复加入)。
code:
class Solution {
public:
void solveSum(vector<int> &A, int pos, int target, vector<int> curRet, int curSum, vector<vector<int> > &ret){
if(curSum == target){
ret.push_back(curRet);
return;
}
else if(curSum > target) return;
for(int i = pos;i < A.size();i++){
vector<int> temp = curRet;
temp.push_back(A[i]);
solveSum(A,i,target,temp,curSum+A[i],ret);
}
}
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > ret;
vector<int> curRet;
sort(candidates.begin(),candidates.end());
solveSum(candidates,0,target,curRet,0,ret);
return ret;
}
};