用c++完成这道题:从 nn 个互不相等的数中,选出 rr 个数的组合,请问有哪些不同的选法,按照字典码的顺序,输出这些选出的数,每组数输出时要求按照从小到大的顺序输出。 比如,假设有 55 个数分别是 11 22 33 44 55 ,从中选出 33 个数的组合有: 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
时间: 2024-03-06 14:50:57 浏览: 68
C++数组,起泡法,选择法,从小到大排序
4星 · 用户满意度95%
以下是使用C++实现的代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 从n个数中选r个数的组合
vector<vector<int>> combinations(int n, int r) {
vector<vector<int>> res;
vector<int> comb(r, 0);
int i = 0;
while (i >= 0) {
comb[i]++;
if (comb[i] > n) {
i--;
} else if (i == r - 1) {
res.push_back(comb);
} else {
i++;
comb[i] = comb[i - 1];
}
}
return res;
}
int main() {
int n = 5; // 总共有5个数
int r = 3; // 从中选3个数
vector<vector<int>> combs = combinations(n, r);
// 输出结果
for (auto comb : combs) {
for (auto num : comb) {
cout << num << " ";
}
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
```
其中,`combinations` 函数实现了从 `n` 个数中选出 `r` 个数的组合,并且将所有的组合保存在一个二维数组中。具体实现方法是使用类似于递归的方式,从第一个数开始,依次向后选数,如果当前选的数超出了范围,则回溯到前一个位置。如果当前选的是最后一个数,则将这个组合保存到结果集中。这个算法的时间复杂度为 $O(\binom{n}{r})$,因为有 $\binom{n}{r}$ 种不同的组合。
阅读全文