原题地址:https://leetcode-cn.com/problems/combination-sum/description/
题目描述:
给定一个无重复元素的数组 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]
]
解题方案:
看上去像是一道要用递归的题,但是每次递归都写不好,主要就是上一级恢复找不到位置,导致经常出错。还是要多加练习啊。。。
代码:
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<vector<int>> ans;
int n = candidates.size();
if(n == 0 || n == 1 && candidates[0] == 0)
return ans;
if(n == 1 && candidates[0] != 0)
if(target % candidates[0] == 0)
{
int k = target / candidates[0];
vector<int> a(k, candidates[0]);
ans.push_back(a);
return ans;
}
vector<int> nums(n);
int p;//第一个比target小的位置
int i;
for(i = 0; i < n; i ++)
if(candidates[i] > target)
break;
if(candidates[i] > target)
p = i - 1;
else
p = n - 1;
getans(candidates, p, target, nums, ans);
return ans;
}
void getans(vector<int>& candidates, int p, int sum, vector<int>& nums, vector<vector<int>>& ans)
{
if(sum == 0)
{
vector<int> nans;
for(int i = 0; i < nums.size(); i ++)
{
if(nums[i] != 0)
{
for(int j = 1; j <= nums[i]; j ++)
nans.push_back(candidates[i]);
}
}
ans.push_back(nans);
for(int m = 0; m <= p + 1; m ++)
nums[m] = 0;
// if(p == 0)
// nums[p + 1] = 0;
}
else if(p == 0)
{
if(sum < candidates[p])
{
// nums[p] = 0;
// for(int m = 0; m <= p; m ++)
// nums[m] = 0;
}
else
{
if(sum % candidates[p] == 0)
{
int k = sum / candidates[0];
nums[p] = k;
sum = 0;
vector<int> nans;
for(int i = 0; i < nums.size(); i ++)
{
if(nums[i] != 0)
{
for(int j = 1; j <= nums[i]; j ++)
nans.push_back(candidates[i]);
}
}
ans.push_back(nans);
for(int m = 0; m <= p; m ++)
nums[m] = 0;
}
}
}
else if(candidates[p] == 0)
;
else
{
int max = sum / candidates[p];
for(int i = 0; i <= max; i ++)
{
sum -= candidates[p] * i;
nums[p] = i;
getans(candidates, p - 1, sum, nums, ans);
// nums[p] = i - 1;
sum += candidates[p] * i;
}
nums[p] = 0;
}
}
};