(LintCode1208)给定一个非负整数的列表a1,a2,…an,再给定一个目标S。现在用+和-两种运算,对于每一个整数,选择一个作为它前面的符号。找出有多少种方法,使得这些整数的和正好等于S。
同时输出这些方法
// By SnowDream
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int count = 0;
vector<vector<int>> solutions; // 存储所有可行解
vector<int> current_ans;
int findTargetSum(vector<int>& nums, int target) {
backtrack(nums, target, 0, 0);
return count;
}
void backtrack(vector<int>& nums, int target, int index, int sum) {
if (index == nums.size()) {
if (sum == target) {
count++;
solutions.push_back(current_ans); // 保存当前路径为一个可行解
}
} else {
// 选择加上当前数
current_ans.push_back(nums[index]);
backtrack(nums, target, index + 1, sum + nums[index]);
current_ans.pop_back(); // 撤销选择
// 选择减去当前数
current_ans.push_back(-nums[index]);
backtrack(nums, target, index + 1, sum - nums[index]);
current_ans.pop_back(); // 撤销选择
}
}
void printSolutions() {
for (const auto& sol : solutions) {
for (const auto& num : sol) {
if(num>0)
cout << "+";
cout << num;
}
cout << "\n";
}
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Solution solution;
vector<int> nums = {1, 1, 1, 1, 1};
int target = 3;
cout << "符合条件的式子一共有" << solution.findTargetSum(nums, target) << "条\n式子如下:\n";
solution.printSolutions();
return 0;
}

167

被折叠的 条评论
为什么被折叠?



