18712 递归实现组合
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
找出从自然数1、2、……、m中任取k个数的所有组合,组合中字典序大的先输出。
例如m=5,k=3,应输出
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
输入格式
两个整数m和k,(1<=k<=m<=10)
输出格式
按字典序输出所有组合
输入样例
5 2
输出样例
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
写不出递归,参考了别人的
太牛啦!
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>
int ans[15];
void digui(int m, int k, int cnt, int flag) {
//结束条件
//当cnt到第k+1层的时候输出
if (cnt > k) {
//输出原来存到的 1到k元素
for (int i = 1; i <= k; i++) {
cout << ans[i] << ' ';
}
cout << endl;
}
else {
//从flag到m中选 如果已选了当前的i 则让下一次从i+1开始选
for (int i = flag; i <= m; i++) {
//存当前的i
ans[cnt] = i;
//让flag为i+1 找第cnt+1层
digui(m, k, cnt + 1, i + 1);
}
}
}
int main(void){
int m, k;
cin >> m >> k;
digui(m, k, 1, 1);
return 0;
}