组合的输出(递归)

组合的输出

时间限制: 1 Sec  内存限制: 128 MB
提交: 13  解决: 7
[提交][状态][讨论版][命题人:quanxing]

题目描述

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。

现要求你用递归的方法输出所有组合。

例如n=5,r=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

输入

一行两个自然数n、r(1<n<21,1≤r≤n)。

输出

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

样例输入

5 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

提示

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int n,r;
bool v[25];
int a[25];
void display()
{
    for(int i=1;i<=r;i++)
    {
        printf("%3d",a[i]);
    }
    cout<<endl;
}

void dfs(int k,int s)
{
    int i;
    if(s==r+1) 
    {
        display();
        return;
    }
    for(i=k;i<=n;i++)
    {
        if(!v[i])
        {
            v[i]=1;
            a[s]=i;
            dfs(i,++s);
            v[i]=0;
            s--;
        }
    }
}



int main()
{
    cin>>n>>r;
    memset(v,0,sizeof(v));
    dfs(1,1);
}

 



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 从自然数中取3个数进行组合递归算法可以用以下步骤描述: 1. 定义递归函数,例如combination(nums, k, start, selected),其中nums表示待选的自然数列表,k表示需要选择的数的个数,start表示当前递归的起始位置,selected表示已经选择的数的列表。 2. 如果需要选择的数的个数k等于0,说明已经选择了足够的数,将已选择的数列表输出即可。 3. 如果待选的自然数列表nums已经被遍历完了,说明已经没有数可选,直接返回。 4. 对于当前递归位置start,有两种情况:选或不选。如果选当前位置的数,则将其加入已选择的数列表,并递归到下一个位置combination(nums, k-1, start+1, selected);如果不选当前位置的数,则直接递归到下一个位置combination(nums, k, start+1, selected)。 5. 将递归函数的结果合并即可得到所有可能的组合。 ### 回答2: 从自然数中任取3个数进行组合,可以将这个过程分解为多个子问题。首先从所有自然数中选定一个数,接着从剩下的数中再选定两个数,将这三个数作为一组输出。 为了实现这个递归算法,我们需要考虑以下几点: 1. 如何确定递归终止条件:即什么时候停止递归输出结果。在这个问题中,当我们从自然数中只剩下两个数时,我们就可以直接输出最终结果了。 2. 如何实现递归过程:即在每一次递归中如何选定一个数,以及如何从剩下的数中再选定两个数。我们可以通过一个for循环来实现这个过程,每一次循环我们选定一个数,然后将剩下的数递归处理。 3. 如何维护递归过程中的状态:即如何保存中间结果,以便在递归结束时输出结果。我们可以使用一个列表来保存每一组选定的数,当递归到最后一层时将这个列表输出即可。 代码实现如下: ``` def combination(n, k, start, path, res): if k == 0: res.append(path) return for i in range(start, n + 1): combination(n, k - 1, i + 1, path + [i], res) def main(): n = 5 k = 3 res = [] combination(n, k, 1, [], res) print(res) if __name__ == '__main__': main() ``` 在这个递归函数中,n表示总共有多少个自然数可选,k表示需要选取多少个数作为一组,start表示从哪个数开始选,path表示中间结果,res表示最终结果。在combination函数中,我们首先判断k是否为0,如果为0则将path加入到res中。如果k不为0,则从start开始循环选取一个数i,然后递归处理剩下的数,直到k为0时将结果保存在res中。最终在main函数中输出res即可。 ### 回答3: 组合问题是指从一个大小为n的集合中取出r个元素,不考虑顺序的排列的方式,即C(n,r)种取法。从自然数中取3个数进行组合,就是从1~n中任选3个数,求出所有可能的组合方式。这个问题可以使用递归算法来解决。 首先,我们需要确定递归函数的参数和返回值。由于需要取3个数,因此可以用一个列表(数组)来存储这3个数。参数包括:当前列表中已经选择的数(其中最后一个数的位置),待选择的数的起始范围,待选择的数的个数,总体的数的个数,以及存储结果的二维数组。返回值为组合的个数。因为需要求出所有的情况,因此可以直接将组合的情况存入结果数组中。 接下来,我们来实现递归函数。具体步骤如下: 1. 如果已经选了3个数,就将这个组合存入结果数组中,并返回1。 2. 如果待选的数的数量小于等于0,就返回0。 3. 对于每个待选的数,递归选择下一个数: a. 将这个数添加到列表中。 b. 递归选择下一个数(即将当前位置+1作为下一个位置,并且待选的数的范围对应减少1个)。 c. 将这个数从列表中删除。 4. 将所有递归得到的结果累加起来,返回总的组合个数。 最后,我们可以用主函数来调用递归函数,并输出结果。主函数需要指定总体的数的个数n,并初始化一个空的列表和一个空的结果数组。然后调用递归函数,并输出结果数组中的所有组合递归算法可以很好地解决从自然数中取3个数进行组合的问题,它的时间复杂度为O(n^3),即需要枚举n个数,每次枚举3个数,因此总共需要枚举C(n,3)种情况。这个算法比暴力枚举的算法时间复杂度要低得多,同时相对来说也更加清晰易懂,代码实现也更加简单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡军帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值