编写程序,采用回溯法输出自然数 1~n 中,任取 r 个数的所有组合。(问 题设定,n=5,r=3)
时间: 2024-03-15 15:44:13 浏览: 94
回溯法可以通过递归实现。具体思路是,从第一个数开始,有选和不选两种情况,如果选,则将该数加入当前组合中,继续递归处理后面的数;如果不选,则直接递归处理后面的数。当组合中的元素个数达到 r 时,输出该组合,返回上一层递归继续处理。
下面是具体实现的代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
void backtrack(vector<int>& nums, int start, int r, vector<int>& cur, vector<vector<int>>& res) {
if (cur.size() == r) {
res.push_back(cur);
return;
}
for (int i = start; i < nums.size(); i++) {
cur.push_back(nums[i]);
backtrack(nums, i+1, r, cur, res);
cur.pop_back();
}
}
vector<vector<int>> combine(int n, int r) {
vector<int> nums(n);
for (int i = 0; i < n; i++) {
nums[i] = i+1;
}
vector<vector<int>> res;
vector<int> cur;
backtrack(nums, 0, r, cur, res);
return res;
}
int main() {
int n = 5, r = 3;
vector<vector<int>> res = combine(n, r);
for (auto& comb : res) {
for (int n : comb) {
cout << n << " ";
}
cout << endl;
}
return 0;
}
```
输出结果为:
```
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
```
阅读全文