一个数字可以重复使用多次,用的时候dfs下标不用加1,这样可以用多次,加上大于target剪枝,也不会用太多。不用的时候下标要加1。
class Solution {
public:
vector<int> run;
vector<vector<int>> ans;
int target;
int n;
void dfs(int idx,int sum,vector<int>& nums){
if(sum>target)
return;
if(sum==target){
ans.push_back(run);
return;
}
if(idx>=n)
return;
run.push_back(nums[idx]);
dfs(idx,sum+nums[idx],nums);
run.pop_back();
dfs(idx+1,sum,nums);
}
vector<vector<int>> combinationSum(vector<int>& nums, int target_) {
target=target_;
n=nums.size();
sort(nums.begin(),nums.end());
dfs(0,0,nums);
return ans;
}
};