18712 递归实现组合
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
#include <iostream>
#include <cstdio>
using namespace std;
int a[20];
void dfs(int M,int K,int m,int k)
{
//当达到K个数(K层),输出
if(k > K){
//输出原来存进a的第1到k元素
for(int i = 1;i <= K;i++){
cout << a[i] << " ";
}
cout << endl; //一层结束,换行
}
else{
//递归排列组合,存入数组
//从m递归到M,每次+1(排列的首个数)
for(int i = m;i <= M;i++){
//存当前数
a[k] = i;
dfs(M,K,i + 1,k + 1);//递归以m+1开头,第k+1层(k+1位数时)的组合
}
}
}
int main()
{
int M,K;
scanf("%d %d",&M,&K);
//函数递归自增,不用循环
dfs(M,K,1,1);
return 0;
}