组合数

来源:互联网 发布:浙江软件行业协会 编辑:程序博客网 时间:2024/06/03 07:05
描述

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


输入

输入n、r。


输出
按特定顺序输出所有组合。

特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。


样例输入
5 3


样例输出
543
542
541
532
531
521
432
431
421
321


思路:搜索题写的不多,特别是深搜,有些迷,本题的代码很简洁,但我也琢磨了好久,然后在本题的基础上拓展一下,输出每一个组合中的值从小到大排列,组合之间按字典序排列。详情见代码二。试着比较理解一下两个代码不同之 处。


代码一:

#include<stdio.h>
int s[10];
void DBF(int n,int r)
{
    int i,j;
    for(i=n;i>0;i--)
    {
        s[r]=i;
        if(r>1)
        {
            DBF(i-1,r-1);
        }
        else
        {
            for(j=s[0];j>=1;j--)//因为r在不断的变化,所以用数组的第一个位置来保存位数
            {
                printf("%d",s[j]);
            }
            printf("\n");
        }
    }
}
int main()
{
    int n,r;
    scanf("%d%d",&n,&r);
    s[0]=r;//存位数,留着输出时做为条件控制
    DBF(n,r);
    return 0;
}



代码二:

#include<stdio.h>
int s[10];
int n;//让n作为全局变量
void DBF(int x,int r)
{
    int i,j;
    for(i=x;i<=n;i++)
    {
        s[r]=i;
        if(r>1)
        {
            DBF(i+1,r-1);//注意:是i加1,不是x。
        }
        else
        {
            for(j=s[0];j>=1;j--)
            {
                printf("%d",s[j]);
            }
            printf("\n");
        }
    }
}
int main()
{
    int r;
    scanf("%d%d",&n,&r);
    s[0]=r;
    DBF(1,r);
    return 0;
}

原创粉丝点击