时间限制:1000MS 代码长度限制:10KB
题型: 编程题 语言: G++;GCC
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>
using namespace std;
/*
5 2
*/
int m, k;
int stk[15]; //用于存储数字组合再一并输出
void dfs(int first, int put) //first指从哪个数字开始选第put个数字
{
if(put > k-1) //数字已经挑选完毕,输出
{
for(int i = 0; i < k; ++i)
{
printf("%d ", stk[i]);
}
printf("\n");
}
else //挑选第put个位置的数字
{
for(int i = first; i <= (m - (k - (put+1))); ++i)
{
stk[put] = i;
//printf("no.%d is %d\n", put+1, i);
dfs(i+1, put+1); //继续找第put+1个数字
}
}
}
int main()
{
scanf("%d %d", &m, &k);
dfs(1, 0);
return 0;
}