算法资源库(4)求组合问题

79 阅读1分钟

 一、 问题描述  

 二、算法思想

       假我们要从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;

}

 方法分析 

     我们可以使用递归的方法来实现这个问题

执行结果 

 结语 

在无人问津的时刻努力

在万人瞩目的地方出现

!!!