利用递归法找出自然数1到n中任取r个数的所有组合,使用c++
时间: 2024-12-02 22:15:21 浏览: 10
C++趣味算法大全!!!!!!!!!!!!!!!
在C++中,我们可以利用递归的方式结合回溯算法来解决这个问题。这是一个经典的背包问题变种,称为"组合生成",可以用`std::vector`来存储当前状态的结果。以下是实现的一个基础版本:
```cpp
#include <iostream>
#include <vector>
// 用于存储结果的辅助结构体
struct Combination {
std::vector<int> items;
int r;
};
// 递归函数,计算给定范围内的所有组合
void generateCombinations(int start, int end, int r, std::vector<int>& result, int index, Combination& combination) {
if (index == r) {
// 如果选择了r个元素,将结果添加到总结果列表中
combination.items = result;
combinations.push_back(combination);
return;
}
for (int i = start; i <= end && result.size() + 1 <= r; i++) {
// 将当前元素添加到组合中
result.push_back(i);
// 继续递归处理下一个元素
generateCombinations(i+1, end, r, result, index+1, combination);
// 回溯移除当前选择,尝试下一个选项
result.pop_back();
}
}
std::vector<Combination> findCombinations(int n, int r) {
std::vector<int> result;
Combination combination {result, r};
std::vector<Combination> combinations;
generateCombinations(1, n, r, result, 0, combination);
return combinations;
}
int main() {
int n = 5, r = 3;
std::vector<Combination> combinations = findCombinations(n, r);
for (const auto& comb : combinations) {
for (int num : comb.items) {
std::cout << num << " ";
}
std::cout << std::endl;
}
return 0;
}
```
在这个代码里,`generateCombinations`函数会递归地尝试所有可能的选择,并在达到目标数量`r`时返回。主函数`findCombinations`调用该函数并收集所有的组合。
阅读全文