思路:暴力搜索+剪枝
暴搜好像没啥好说的。关键点在于剪枝和去重。
因为数字可以重复使用,但是不能出现[2,2,3],[2,3,2]这样重复的答案。解决方法是搜索时,记录一下下标,每次搜索都从当前开始,这样即保证了可以重复使用某一个数,又保证了没有重复的答案。
剪枝的思路在于,先排序,如果当前的数字已经打于target,那么根本没有必要搜索下去。
class Solution {
public:
vector<int> nums;
vector<vector<int>> ans;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
ans.clear();
vector<int> res;
for(int i=0;i<candidates.size();i++)
{
nums.push_back(candidates[i]);
}
sort(nums.begin(),nums.end());
dfs(target,res,0);
return ans;
}
void dfs(int target,vector<int> &tmp,int k)
{
if(target<0)
{
tmp.clear();
return;
}
if(target==0)
{
ans.push_back(tmp);
tmp.clear();
return;
}
for(int i=k;i<nums.size();i++)
{
if(nums[i]>target)
{
break;
}
vector<int> tm=tmp;
if(target>=nums[i])
{
// cout<<nums[i]<<endl;
tm.push_back(nums[i]);
dfs(target-nums[i],tm,i);
}
}
}
};