帮我去掉注释还有vector改数组:#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;}
时间: 2024-03-06 22:50:58 浏览: 60
以下是去掉注释和使用数组的代码:
```c++
#include <iostream>
using namespace std;
const int MAXN = 20;
int comb[MAXN];
// 从n个数中选r个数的组合
int combinations(int n, int r, int start, int index) {
if (index == r) {
for (int i = 0; i < r; i++) {
cout << comb[i] << " ";
}
cout << endl;
return 0;
}
for (int i = start; i <= n; i++) {
comb[index] = i;
combinations(n, r, i + 1, index + 1);
}
return 0;
}
int main() {
int n = 5; // 总共有5个数
int r = 3; // 从中选3个数
combinations(n, r, 1, 0);
return 0;
}
```
其中,`combinations` 函数使用了递归的方法,从第一个数开始,依次向后选数,直到选够了 `r` 个数,然后将这个组合输出。为了保证每个组合都是按字典码顺序输出的,我们规定每个组合中的数必须按照从小到大的顺序排列,同时在递归过程中,我们从 `start` 开始选数,避免了重复的组合。这个算法的时间复杂度为 $O(\binom{n}{r})$,因为有 $\binom{n}{r}$ 种不同的组合。
阅读全文