题目:
给定一个无重复元素的数组 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]
]
思路:target/candidates[i]为各个数字所能添加的最大个数,排列组合各种数字添加情况,将和为target的放入结果集。
//结果集
vector<vector<int>> res;
//can是给定数字数组,count是已经添加数字的总和,index是现在正在添加数字的下标
void helper(vector<int> can,vector<int> &temp,int len,int target,int count,int index)
{
if(index==len||count==target)
{
if(count==target)
res.push_back(temp);
return;
}
else
{
//每种数字所能放入的最大个数
int n = target/can[index];
for(int i=0;i<=n;i++)
{
if((can[index]*i+count)<=target)
{
for(int j=0;j<i;j++)
temp.push_back(can[index]);
helper(can,temp,len,target,count+can[index]*i,index+1);
for(int j=0;j<i;j++)
temp.pop_back();
}
else
return;
}
}
}
vector<vector<int>> combinationSum(vector<int> &candidates, int target)
{
int len = candidates.size();
if(len==0)
return res;
vector<int> temp;
helper(candidates,temp,len,target,0,0);
return res;
}