您的位置:首页 > 其它

CZY的组合数烦恼

2015-08-11 11:28 204 查看
时间限制: 3 Sec

内存限制: 128 MB

提交: 55

解决: 25

[提交][状态][讨论版]

题目描述

czy最近对组合数产生了浓厚的兴趣,一天他心血来潮,想排n个数字,但是很快他发现种类太多了,于是他决定从中随机找出m个数排,但还是太多了,所以他想请聪明的你写个程序帮助他找到所有种类的排列

输入

输入包括多组测试数据,每组包括一行整数n(1<=n<10),m(1<=m<=n),空格间隔

输出

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

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

样例输入

5 3

样例输出

543

542

541

532

531

521

432

431

421

321

做完这题才意识到原来自己对dfs还不是太熟练,它是找出所有的可能,所以也能输出所有的可能~~

#include<stdio.h>
#include<string.h>
#define max 0xfffffff//是这一位小于前一位,所以定义一个无穷大赋值给a[0],使它一定比a[1]大
int n,m,w[12],a[12];
void dfs(int x)
{
    if(x>m)
    {
        for(int i=1;i<=m;i++)
            printf("%d",a[i]);
        printf("\n");
        return ;
    }//控制位数 
    else
    {
        for(int i=n;i>=1;i--)
        {
            a[x]=i;
            if(w[i]==0&&a[x]<a[x-1])
            {
                w[i]=1;
                dfs(x+1);
                w[i]=0;
            }   
        }       
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(w,0,sizeof(w));
        a[0]=max;
        dfs(1);

    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: