排列与组合是数学里的经典问题,由这个问题可引申出子集、字典排序等问题,那么,我们先看经典的排列与组合,怎么在程序里实现。

在网上搜了一下,关注这个问题的人还是挺多的,有不了人给出的回答是使用几个for循环进行嵌套,例如取3个数的排列则使用3个for循环i,j,k嵌套,当i,j,k互不相等时进行输出,这样的函数虽然是正确的,但是没有通用性,我们要实现的是从m中取n,m、n皆为变量。

通过数学公式我们知道,

先来看排列的实现,假如集合为{ABC},取出2个的排列为AB AC BA BC CA CB,从这里我们不难看出,第一个字母可从{ABC}中任取一个,假如选了A,第二字母从剩下的集合中{BC}再任选一个,这样便完成了排列,规则其实很简单,取n个数,从第一个数开始选,选完之后从集合中去掉这个数,开始选第2个数,一直到取第n个数为止。

程序里我们这样设计,对一个数组里的元素进行排列,我们可将数组分为两部分,已排集合及未排的集合,每次挑选第i个数时,arr[0]至arr[i-1]为已排集合,未排集合为arr[i]至arr[m-1],这里从未排集合中依次取出一个元素,交到当前arr[i]的位置,此时未排集合变为arr[i+1]至arr[m-1],并开始递归选择i+1个数,直到i=n,选择结束,请看下图:

 

下面来看组合数的情况,设集合为{ABCD},选则3个数进行组合,组合情况为:

ABC

ABD

ACD

BCD

情况与排列的类似,但有一点不同的是,假设第一个数选了A,则剩下的集合为{BCD},这样便输出了所有包含A的组合情况;这时,当第一个数选了B时,则剩下的集合为{CD},而不是{ACD},因为所有包含A的组合已经输出了,即A已经从当前集合中排除了。

程序里我们这样设计,对一个数组里的元素进行排列,我们可将数组分为两部分,已选择的集合及未排的集合,每次挑选第i个数时,arr[0]至arr[i-1]为已排元素,未排集合为arr[j]至arr[m-1],这里未排集合中依次取出一个元素,假设为arr[k],其中k在[j,m-1]之间,交换到当前arr[i]的位置,此时未排集合为arr[k+1]至arr[m-1],并开始递归选择i+1个数,直到i=n,选择结束。

【查看完整代码实现】

排列与组合的C语言实现的更多相关文章

  1. 字符串数组元素排列与组合的Java递归实现

      我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串ab ...

  2. dfs 生成排列和组合

    利用深度优先搜索的性质可以方便的生成n的排列和组合,但是生成组合时每个组合里面元素的个数必须事先确定,以前以为生成组合跟排列一样到n时就可以回溯,直到今天做了某题之后才发现那是错的,那样做生成不了所有 ...

  3. OI内的排列与组合(简单版)

    §1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...

  4. 【组合数学】OI内的排列与组合(简单版)

    §1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...

  5. 108_Power Pivot购物篮分析分组GENERATE之笛卡尔积、排列、组合

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 昨天在看论坛帖子时候(帖子),看到一个关于SKU组合的问题,有很多M大佬都给出了处理方案,于是想用dax也写一个 ...

  6. 排列组和在c语言中的应用

    排列组和在c中很常见,但是这个排列组和是通过循环来实现的,和数学中的还是有一点区别的,而且c中的方法也不尽相同,而且我遇到c中的数学问题总会纠结于数学上是怎么实现的但是我自己又不会,所以就没了兴趣,例 ...

  7. python 生成排列、组合以及选择

    from <python cookbook> 19.15 任务 需要对一个序列的排列(permutation).组合(combination)或选择(selection)进行迭代操作.即使 ...

  8. hdu1570(排列和组合公式的应用)

    题意: 给出字符A.则求全排列 A(n,m)=n!/(n-m)! 给出字符C.则求全组合 C(n,m)=n!/(m!*(n-m)!) http://acm.hdu.edu.cn/showproblem ...

  9. MATLAB中常用的排列、组合、阶乘函数

    1.求n的阶乘,方法如下:a.factorial(n)b.gamma(n+1)c.v='n!'; vpa(v) 2.求组合(数),方法如下:a.combntns(x,m)    列举出从n个元素中取出 ...

随机推荐

  1. 1041. Be Unique (20)

    Being unique is so important to people on Mars that even their lottery is designed in a unique way. ...

  2. Nginx 配置指令的执行顺序(一)

    大多数 Nginx 新手都会频繁遇到这样一个困惑,那就是当同一个 location 配置块使用了多个 Nginx 模块的配置指令时,这些指令的执行顺序很可能会跟它们的书写顺序大相径庭.于是许多人选择了 ...

  3. QT:程序忙碌时的进度条——开启时间循环,等结束的时候再退出

    当程序在执行一项(或多项)耗时比较久的操作时,界面总要有一点东西告诉用户“程序还在运行中”,那么,一个“没有终点”的进度条就是你需要的了.PS:最好把耗时的操作扔到一个子线程中去,以免他阻塞了界面线程 ...

  4. OSCHina技术导向:Java开源QQ工具iQQ

    iQQ 使用Java语言跨平台开发,基于腾讯WebQQ 3.0网络协议.可以使用于Java所支持的各种平台上运行.作者基于Linux(Ubuntu 12.04)系统,使用IDE NetBeans开发, ...

  5. ubuntuOS

    OpenStack icehource for Ubuntu OS 1,网络规划 2,Ntp apt-get install ntp 3,generate secure passwd apt-get ...

  6. 使用ObjectAnimator开发打开、关闭书本动画

    动画效果 动画效果-分享链接 (想做成gif图的,尝试各种工具无果) ObjectAnimator简单介绍及实现思路 ObjectAnimator是从api level 11 (Android3.0x ...

  7. 依赖注入及AOP简述(七)——FQCN请求模式

    2.2.    FQCN请求模式 为了弥补纯字符串请求模式中的类型安全问题,全类名(FQCN)请求模式就应运而生了.其思想便是,在向容器请求依赖对象的时候,不是通过字符串的标识符.而是通过被请求的依赖 ...

  8. timeout Timeout时间已到.在操作完成之前超时时间已过或服务器未响应

    Timeout时间已到.在操作完成之前超时时间已过或服务器未响应 问题 在使用asp.net开发的应用程序查询数据的时候,遇到页面请求时间过长且返回"Timeout时间已到.在操作完成之间超 ...

  9. T-SQL事务

    事务 订火车票的时候,下一个订单,这个订单中,包含多个购买信息,要么全部执行,要么全部不执行,合作事务就是来处理这种模型的一种机制. --关键字:transaction 或 tran 简写形式 --开 ...

  10. MongoDB 操作

    通过CMD命令操作数据 确保MongoDB的服务已经正常安装,记下安装目录(D:\MongoDB\Service) 然后打开cmd 先转到D盘 cd D: 然后转到服务的安装目录下 cd D:\Mon ...