zoukankan      html  css  js  c++  java
  • 组合数问题 (Mathematics)

    题目:

    描述
    找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。

    输入

    输入n、r。
    输出
    按特定顺序输出所有组合。
    特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
    样例输入
    5 3
    样例输出
    543
    542
    541
    532
    531
    521
    432
    431
    421
    321
     
    递归很好解决!
    为什么是递归?
    f(n,r),确定了第一个数后,剩下的问题就是从其余n-1个数里找r-1个数的组合,即f(n-1,r-1);当第二个参数是1时,说明找到一个组合了,就输出。
    循环+递归;在纸上画一下程序的执行流程就非常清晰了!

    代码:

    #include<stdio.h>

    void fun(int n,int k);
    int a[10];

    int main()
    {
    int n,r;
    scanf("%d%d",&n,&r);
    a[0] = r;// 保存组合数的长度
    fun(n,r);

    // system("pause");
    return 0;
    }

    void fun(int n,int k)
    {
    int i,j;

    for(i = n ; i > 0 ; --i)//每个递归里也有这个循环!!!
    {
    a[k] = i;
    if(k > 1 )
    fun(i-1,k-1);//递归,不是fun(n-1,k-1),否则会重复的
    else
    {
    for(j = a[0]; j > 0 ; --j)
    printf("%d",a[j]);
    printf("\n");
    }
    }
    }
     
  • 相关阅读:
    阿狸的打字机(bzoj 2434)
    Censoring(bzoj 3940)
    文本生成器(bzoj 1030)
    病毒(bzoj 2938)
    Road(bzoj 2750)
    codevs 2370 小机房的树
    HDU 2838 Cow Sorting
    luogu P2253 好一个一中腰鼓!
    hdu 1166 敌兵布阵
    luogu P1901 发射站
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/2261524.html
Copyright © 2011-2022 走看看