子集树
什么是子集树?
子集树是一种在组合优化问题中常用的数据结构。它用于生成问题的所有可能子集。
示例:子集求和问题
给定一组数字,找出所有可能的子集,使它们的和等于特定的目标值。我们可以使用回溯法和子集树来解决这个问题。
代码示例:
#include <iostream>
#include <vector>
using namespace std;
void subsetSum(vector<int>& nums, int target, vector<int>& path, vector<vector<int>>& result, int start) {
if (target == 0) {
result.push_back(path);
return;
}
for (int i = start; i < nums.size(); ++i) {
if (nums[i] <= target) {
path.push_back(nums[i]);
subsetSum(nums, target - nums[i], path, result, i + 1);
path.pop_back();
}
}
}
vector<vector<int>> findSubsets(vector<int>& nums, int target) {
vector<vector<int>> result;
vector<int> path;
subsetSum(nums, target, path, result, 0);
return result;
}
int main() {
vector<int> nums = {1, 2, 3, 4, 5};
int target = 6;
vector<vector<int>> subsets = findSubsets(nums, target);
for (const vector<int>& subset : subsets) {
cout << "[";
for (int num : subset) {
cout << num << " ";
}
cout << "]" << endl;
}
return 0;
}
排列树
什么是排列树?
排列树用于生成问题的所有可能排列。它在排列问题中非常有用,如全排列、字符串的全排列等。
示例:全排列问题
给定一组数字,找出它们的所有可能排列。我们可以使用回溯法和排列树来解决这个问题。
代码示例:
#include <iostream>
#include <vector>
using namespace std;
void generatePermutations(vector<int>& nums, vector<vector<int>>& result, int start) {
if (start == nums.size()) {
result.push_back(nums);
return;
}
for (int i = start; i < nums.size(); ++i) {
swap(nums[start], nums[i]);
generatePermutations(nums, result, start + 1);
swap(nums[start], nums[i]);
}
}
vector<vector<int>> findPermutations(vector<int>& nums) {
vector<vector<int>> result;
generatePermutations(nums, result, 0);
return result;
}
int main() {
vector<int> nums = {1, 2, 3};
vector<vector<int>> permutations = findPermutations(nums);
for (const vector<int>& permutation : permutations) {
cout << "[";
for (int num : permutation) {
cout << num << " ";
}
cout << "]" << endl;
}
return 0;
}
总结
子集树用于生成组合问题的所有可能子集,而排列树用于生成排列问题的所有可能排列。