一、 问题描述
二、算法思想
假我们要从n个自然数中选取r个数的组合。
首先,我们可以选取最大的数n作为一个组合中的数,然后从剩下的n-1个数中选取r-1个数的组合,这样就可以得到一个以n开头的组合。
然后,我们再从剩下的n-1个数中选取r个数的组合,这样就可以得到一个不以n开头的组合。
递归终止的条件是当r等于1时,我们就可以直接输出剩下的n个数中的每一个数作为一个组合。
三、代码实现
#include <stdio.h>
int n,m;
int num[10]= {0};
void dfs(int x,int r)
{
if(r==m+1)
{
for(int i=1;i<=m;i++)
printf("%d ",num[i]);
printf("\n");
}
for (int i = x; i >0; i--)
{
num[r] = i;
dfs(i-1,r+1);
}
}
int main(void)
{
while(~scanf("%d%d",&n,&m))
{
dfs(n,1);
}
printf("end");
return 0;
}
方法分析
我们可以使用递归的方法来实现这个问题
执行结果
结语
在无人问津的时刻努力
在万人瞩目的地方出现
!!!