用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 输入 第 11 行输入两个整数 nn(3≤n≤203≤n≤20)和 rr(1≤r≤n1≤r≤n); 第 22 行输入 nn 个整数,数字之间用空格隔开,请注意:输入的n个整数不保证是有序的。 输出 输出若干行,每行有 rr 个数,用空格隔开。
时间: 2024-03-14 12:45:42 浏览: 21
以下是用C++完成该题的代码,采用了递归的方式进行组合:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
int n, r;
int nums[20], comb[20];
void dfs(int cur, int cnt) {
if (cnt == r) { // 选出r个数
for (int i = 0; i < r; i++) {
cout << comb[i] << " ";
}
cout << endl;
return;
}
if (cur == n) return; // 所有数都已经遍历完
comb[cnt] = nums[cur]; // 选当前数
dfs(cur+1, cnt+1);
dfs(cur+1, cnt); // 不选当前数
}
int main() {
cin >> n >> r;
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
sort(nums, nums+n); // 排序
dfs(0, 0);
return 0;
}
```
具体思路是通过递归的方式进行组合,每次递归都选择当前位置的数或者不选择,直到选出r个数。同时,为了保证输出顺序,我们需要先将输入的数字进行排序。