给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7 所求解集为:[ [7],[2,2,3]]
示例 2:
输入: candidates = [2,3,5], target = 8, 所求解集为:[ [2,2,2,2], [2,3,3], [3,5]]
解题思路:根据题目要求,我们很容易想到要用深度优先搜索去完成这道题目;
代码:
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
vector<int>temp;//表示一个解决方案
vector<vector<int>>res;//表示最后所有方案的组合
dfs(candidates,target,0,temp,res);
return res;
}
void dfs(vector<int>& candidates,int target,int index,vector<int>&temp,vector<vector<int>>&res)
{
if(target==0)//表示搜索到此,已经形成了一个方案
{
res.push_back(temp); //将此方案加入;
return; //结束
}
if(target<0)//此时表示深度优先搜索回退
return;
for(int i=index;i<candidates.size();++i)
{
temp.push_back(candidates[i]);//将此值加入方案中
dfs(candidates,target-candidates[i],i,temp,res);//递归进行深度搜索
temp.pop_back();//回退
}
}