给你一个没有排序的序列和一个target,求出序列的和的值为target,允许序列中选择的值可以重复。
直接用递归。由于需要答案有序,所以先把序列排序,然后再递归的时候不能选择比上一次小的值,可以避免重复的计算。
其中不要随便运用vector<int>uu中的uu.size()-1这个数,会出错的,当uu.size()为0的时候。
class Solution {
public:
void get_ans(int ans,vector<int>& nums,vector<vector<int>>&an,vector<int> get_ss,int limit){
if(ans==0){an.push_back(get_ss);return ;}
for(int ii=0;ii<nums.size();ii++){
if(ans-nums[ii]<0||ii<limit)continue;
get_ss.push_back(nums[ii]);
get_ans(ans-nums[ii],nums,an,get_ss,ii);
get_ss.erase(get_ss.end()-1);
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
for(int ii=0;ii<candidates.size();ii++){
if(ii&&candidates[ii]==candidates[ii-1])candidates.erase(candidates.begin()+ii);
}
vector<vector<int>>yy;
vector<int>uu;
get_ans(target,candidates,yy,uu,0);
return yy;
}
};