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

在网上搜了一下,关注这个问题的人还是挺多的,有不了人给出的回答是使用几个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. 水池(DFS)

    水池数目 点我 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中 ...

  2. KVO的实现原理探寻

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. UVA 10129 Play on Words

    欧拉回路 以字母为结点,单词为边:注意两个相同的单词表示两条边. 并查集判断是否连通,出度,入度判断是否是欧拉回路 #include <iostream> #include <cst ...

  4. 李维作答 《insideVCL》——李维实在很勤奋,而且勇于突破,从不以旧的内容充数

    (编者按)<Inside VCL(VCL核心架构剖析)>一书出版以来,众多热心读者给李维先生.博文视点公司.CSDN写来信件,有更多朋友在各个论坛上发表关于该书的言论.读者们不但盛赞该书, ...

  5. 为什么不能在scrollview中直接添加一个image,然后使animation.begin()??

    http://stackoverflow.com/questions/17267451/animation-cant-begin-in-scrollview-in-windows-phone 以上是我 ...

  6. codevs2822 爱在心中

      2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无 ...

  7. 在线获取访客QQ号码的原理及实现方法

    原文地址:http://www.piaoyi.org/network/get-qq-haoma-js.html 正 文: 最近,飘易收到不少在线获取网站访客QQ号码的促销推广邮件,有不少商用网站挖掘了 ...

  8. Node.js log2: ERR when execute command >npm install

    1.Node.js创建项目 项目microblog创建成功,提示:cd  microblog& npm install 项目创建完成时的目录如下图所示: 2.Node.js错误 如题所言: E ...

  9. Google map v3 using simple tool file google.map.util.js v 1.2

    更新添加日志:在1.1的基础上添加marker的文字显示.测距工具. /** * GOOGLE地图开发使用工具 * @author BOONYACHENGDU@GMAIL.COM * @date 20 ...

  10. they're hiring

    Gather Health ⋅ Careers Careers at Gather