子集和问题。设n个不同的正整数构成集合S,求出使得和为某数M的S的所有子集。使用C++实现
时间: 2024-02-11 08:10:05 浏览: 104
这是一个经典的搜索问题,可以通过回溯算法求解。具体实现如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
void backtrack(vector<int>& nums, int target, vector<int>& path, int start, vector<vector<int>>& res) {
if (target < 0) return;
if (target == 0) {
res.push_back(path);
return;
}
for (int i = start; i < nums.size(); i++) {
path.push_back(nums[i]);
backtrack(nums, target - nums[i], path, i + 1, res);
path.pop_back();
}
}
vector<vector<int>> subsetSum(vector<int>& nums, int target) {
vector<vector<int>> res;
vector<int> path;
backtrack(nums, target, path, 0, res);
return res;
}
int main() {
vector<int> nums = {1, 2, 3, 4, 5};
int target = 7;
vector<vector<int>> res = subsetSum(nums, target);
for (auto& vec : res) {
for (int x : vec) {
cout << x << " ";
}
cout << endl;
}
return 0;
}
```
给定一个集合 `nums` 和目标和 `target`,我们通过调用 `subsetSum` 函数来求解所有和为 `target` 的子集。其中回溯函数 `backtrack` 的参数分别为当前正在搜索的集合 `nums`,目标和 `target`,当前已经搜索到的路径 `path`,当前搜索的起始位置 `start`,以及最终结果 `res`。在搜索过程中,我们首先判断是否超过目标和,如果是则直接返回;如果等于目标和,则将当前路径加入到结果中;否则遍历从 `start` 开始的所有数,依次将其加入到路径中,并递归搜索下一个数。搜索完当前数之后,需要将其从路径中弹出,以便搜索下一个数。
在主函数中,我们给定了一个例子,集合为 `{1, 2, 3, 4, 5}`,目标和为 `7`,运行结果为:
```
2 5
3 4
1 2 4
1 3 3
1 6
2 3 2
4 3
5 2
1 2 3
```
其中每一行为一个符合条件的子集。
阅读全文