描述
给1到N,N个数,要你从中选取M个出来,请输出每一种的选取情况(根据序列字典序输出,即两个序列比大小,第一位小的小,若相等第二位小的小,若相等第三位小的小……)。
输入
输入一行,包括两个整数N, M。(2 \lt M \lt N \le102<M<N≤10)
输出
输出若干行,每行表示一个组合方式,按字典序输出。
注意:每行末尾有空格
1、递归计数器cou不等于选择数k,则从标记点start开始到n-k+cou结束进行选择;
2、隐去的是全排列的代码。
#include <stdio.h>
#include <stdlib.h>
/*void swap(int* a,int x,int y)
{
int t;
t=a[x];
a[x]=a[y];
a[y]=t;
}
void perm(int *a,int m,int n)
{
if(m==n)
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for(int i=m;i<n;i++)
{
swap(a,m,i);
perm(a,m+1,n);
swap(a,m,i);
}
}
}*/
void slct(int *a,int *b,int cou,int k,int n,int start)
{
if(cou==k)
{
for(int i=0;i<k;i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for(int i=start;i<=n-k+cou;i++)
{
a[cou]=b[i];
slct(a,b,cou+1,k,n,i+1);
}
}
}
int main()
{
int n,k,b[10]={1,2,3,4,5,6,7,8,9,10},a[10]={0};
scanf("%d%d",&n,&k);
slct(a,b,0,k,n,0);
return 0;
}