题目描述
给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。candidates
中的数字可以无限制重复被选取。说明:(1)所有数字(包括 target
)都是正整数。(2)解集不能包含重复的组合。
举例
示例一:
输入: candidates = [2,3,6,7], target = 7
输出: [ [7], [2,2,3] ]
示例二:
输入: candidates = [2,5,2,1,2], target = 5
输出: [2,2,2,2], [2,3,3], [3,5]
解题方法:回溯。
代码
#include <iostream>
#include <algorithm>
#include <vector>
void backtrack(std::vector<int>& nums,
int sum,
std::vector<int>& current_nums,
std::vector<std::vector<int> > &result,
int start) {
if (sum == 0) {
result.emplace_back(current_nums);
}
int n = nums.size();
for (int i = start; i < n; i++) {
if (nums[i] <= sum) {
current_nums.emplace_back(nums[i]);
backtrack(nums, sum - nums[i], current_nums, result, i);
current_nums.pop_back();
}
}
}
std::vector<std::vector<int> > combines_sum(std::vector<int>&nums, int sum) {
std::vector<std::vector<int> > result;
std::vector<int> current_nums;
backtrack(nums, sum, current_nums, result, 0);
return result;
}
void print_result(const std::vector<int>& nums,
int target,
const std::vector<std::vector<int> > result) {
std::cout << "====" << std::endl;
// input
std::cout << "nums:" << std::endl;
for (auto value : nums) {
std::cout << value<< " ";
}
std::cout << std::endl;
std::cout << "target:" << target << std::endl;
// output
std::cout << "output:" << std::endl;
for (const auto& arr : result) {
for (auto value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
}
}
int main() {
// case1: candidates = [2, 3, 6,7], target=7
std::vector<int> nums = {2, 3, 6, 7};
auto target = 7;
auto result = combines_sum(nums, target);
print_result(nums, target, result);
// case2: candidates = [2, 3, 5], target=8
nums = {2, 3, 5};
target = 8;
result = combines_sum(nums, target);
print_result(nums, target, result);
return 0;
}
代码运行结果如下:
====
nums:
2 3 6 7
target:7
output:
2 2 3
7
====
nums:
2 3 5
target:8
output:
2 2 2 2
2 3 3
3 5