搜档网
当前位置:搜档网 › 组合数学中的全排列生成算法完整版

组合数学中的全排列生成算法完整版

组合数学中的全排列生成算法完整版
组合数学中的全排列生成算法完整版

组合数学全排列生成算法

组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处。

不论是哪种全排列生成算法,都遵循着“原排列”→“原中介数”→“新中介数”→“新排列”的过程。其中中介数依据算法的不同会的到递增进位制数和递减进位制数。关于排列和中介数的一一对应性的证明我们不做讨论,这里仅仅给出了排列和中介数的详细映射方法。相信熟练掌握了方法就可以顺利通过这部分的考察。

递增进位制和递减进位制数

所谓递增进位制和递减进位制数字是指数字的进制随着数字位置的不同递增或递减。通常我们见到的都是固定进制数字,如2进制,10进制等。m位n进制数可以表示的数字是m*n个。而m位递增或递减进位制数则可以表示数字m!个。例如递增进位制数4121,它的进制从右向左依次是2、3、4、5。即其最高位(就是数字4那位)最大值可能是4;第三高位最大可能是3;第二高位最大可能是2;最末位最大可能是1。如果将4121加上1的话,会使最末位得到0,同时进位;第二位的2与进位相加,也会得到0,同时进位;第三位的1与进位相加得到2,不再进位。最终得到结果是4200。递减进位制的道理是一样的,只不过进制从右向左依次是9、8、7、6……,正好与递增进位制相反。很明显,递减进位制的一个最大的好处就是加法不易进位,因为它在进行加法最频繁的末几位里(最右边)进制比较大。

接下来要了解的是递增进位制、递减进位制数和其序号的关系。递增、递减进位制数可以被看作一个有序的数字集合。如果规定递增进位制和递减进位制数的0的序号是十进制0,递增进位制数的987654321和递减进位制数的123456789对应十进制序号362880(即9!),则可以整理一套对应法则。其中,递增进位制数(a1 a2 a3 a4 a5 a6 a7 a8 a9)为:

a1*9! + a2*8! + ….+ a8*2! + a9*1! =序号

例如序号100的递增进位制数就是4020,即4*4!+ 0*3!+ 2*2!+ 0*1!=100。将一个序号转换成其递增进位制数首先需要找到一个比序号小的最大阶乘数(即1、2、6、24、120、720……),对其进行整数除得到递增进位制的第一位;将除法的余数反复应用这个方法(当然,之后选择的余数是小一级的阶乘数),直到余数为0。

递减进位制数(a1 a2 a3 a4 a5 a6 a7 a8 a9)为:

(((((((((a1 * 1 + a2) * 2 + a3) * 3 + …… + a7) * 8 + a8) * 9 + a9=序号

例如序号100的递减进位制数就是131(a7 a8 a9,即从后对齐),即(1*8 + 3)*9 + 1 = 100。将一个序号转换成其递减进位制数,需要对序号用9取余数,就可以得到递减进位制的最末位(这点和递增进位制先算出最高位相反)。用余下的数的整数除结果重复此过程(当然,依次对8、7、6……取余),直到余数为0。

关于递增进位制和递减进位制需要注意的重点:一是其加减法的进位需要小心;二是序号和数字的转换。除了100之外,常见的转换有:999的递增数是121211,递减数是1670;99的递

增数是4011,递减数是130。大家可以以此为参考测试自己是否真正理解了计算的方法。下文将省略递增进位制或递减进位制的详细计算过程。

从现在开始我们将详细介绍六种排列生成算法。具体的理论介绍将被忽略,下文所注重的就是如何将排列映射为中介数以及如何将中介数还原为排列。我全部以求839647521的下100个排列为例。

字典全排列生成法

映射方法:将原排列数字从左到右(最末尾不用理会),依次查看数字右侧比其小的数字有几个,个数就是中介数的一位。例如,对于排列839647521。最高位8右侧比8小的有7个数字,次高位3右侧比3小的数字有2个,再次位的9的右侧比9小的有6个数字,……,2的右侧比2小的数有1个。得到递增进制中介数72642321。(此中介数加上100的递增进进制数4020后得到新中介数72652011)

还原方法:还原方法为映射方法的逆过程。你可以先写出辅助数字1 2 3 4 5 6 7 8 9,以及9个空位用于填充新排列。然后从新中介数的最高位数起。例如新中介数最高位是x,你就可以从辅助数字的第一个没有被使用的数字开始数起,数到x。第x+1个数字就应当是空位的第一个数字。我们将此数字标为“已用”,然后用其填充左起第一个空位。然后,再看新中介数的次高位y,从辅助数字的第一个未用数字数起,数到一。第y+1个数字就是下一个空位的数字。我们将此数字标为“已用”,然后用其填充左起第二个空位。依此类推,直到最后一个中介数中的数字被数完为止。例如对于新中介数72652011,我们给出其辅助数字和空位的每一步的情况。其中红色的数字代表“正在标记为已用”,“已用”的数字不会再被算在之后的计数当中。当新中介数中所有的数字都被数完了,辅助数字中剩下的唯一数字将被填入最后的空位中。最终得到新排列839741562。

递增进位排列生成算法

映射方法:将原排列按照从9到2的顺序,依次查看其右侧比其小的数字的个数。这个个数就是中介数的一位。例如对于原排列839647521。9的右侧比9小的数字有6个,8的右侧比8小的数字有7个,7的右侧比7小的数字有3个,……2的右侧比2小的数字有1个。最后得到递增进制中介数67342221。(此中介数加上100的递增进制数4020得到新的中介数67351311)

还原方法:我们设新中介数的位置号从左向右依次是9、8、7、6、5、4、3、2。在还原前,画9个空格。对于每一个在位置x的中介数y,从空格的右侧向左数y个未被占用的空格。在第y+1个未占用的空格中填上数字x。重复这个过程直到中介数中所有的位都被数完。最后在余下的最后一个空格里填上1,完成新排列的生成。以新中介数67351311为例,我给出了详细的恢复步骤。其中红色数字代表新填上的数字。最后得到新排列869427351。

递减进位排列生成算法

映射方法:递减进位制的映射方法刚好和递增进位制相反,即按照从9到2的顺序,依次查看其右侧比其小数字的个数。但是,生成中介数的顺序不再是从左向右,而是从右向左。生成的递减进制中介数刚好是递增进位排列生成算法得到中介数的镜像。例如839647521的递减进制中介数就是12224376。(此中介数加上100的递减进制数131后得到新中介数12224527)

还原方法:递减进位制中介数的还原方法也刚好和递增进位制中介数相反。递增进位制还原方法是按照从中介数最高位(左侧)到最低位(右侧)的顺序来填数。而递减仅位置还原方法则从中介数的最低位向最高位进行依次计数填空。例如对于新中介数12224527,我给出了详细的还原步骤。红色代表当前正在填充的空格。最终得到新排列397645821。

循环左移排列生成算法

映射方法:循环左移排列生成算法与递减进位排列生成算法非常相似,同样是在原始排列中找到比当前数字小的数字个数。只不过循环左移使用的是左循环搜索法,而不是递减进位法使用的右侧搜索。所谓左循环搜索法是指从起始数字开始向左搜索,如果到了左边界还没有发现终止数字,则从右边界开始继续寻找,直到终止数字被发现。图中展示了839647521种以开始数字为6,结束数字为5和开始数字为7,结束数字为6的左循环搜索区间,注意开始和结束数字是不包括在区间内的。

具体到循环左移的排列生成法得映射方法,就是要为每一个数字确定这样一个区间。方法是以从9到2的顺序依次产生中介数中的数字,中介数从右向左产生(即原排列的9产生的数字放到中介数右数第一位,8产生的数字放到中介数右数第二位,以此类推。这样才能得到递减进位制数)。对于9,产生的中介数字依然是9的右边比9小的数字的个数。但是从8开始一直到2中的每一个数i,都是要做一个以i+1为开始数字,i为结束数字的左循环区间,并看这个左循环区间中比i小的数字的个数。例如对于排列839647521,9的右侧比9小的数字有6个;9到8的左循环区间比8小的数字有1个;8到7的左循环区间比7小的数字有3个;7到6的左循环区间比6小的数字有1个(如上面图下半部所示);6到5的左循环区间比5小的右3个数字(如上图上半部分所示);……;3到2的左循环区间里比2小的数字有1个。所以得到递减中介数10031316(此中结束加上100的递减进制数131得新中介数10031447)

还原方法:循环左移的还原方法很自然。首先画9个空格。当拿到新的中介数后,从中介数的最右边向左边开始计数逐个计数。计数的方法是,对于中介数最右边的数x9,从空格的最右端起数x9个空格,在第x9+1个空格上填上9。然后对于中介数的每一位x i,沿着左循环的方向数x i个未占用空格,在第x i+1个空格里填上i,即可完成还原。我给出了将中介数10031447还原的步骤,其中底纹代表为了定位下一个数字而数过的空格。红色代表被填充的空格。最终得到结果592138647。

邻位对换排列生成算法

邻位对换法对连续生成排列作了优化,即通过保存数字的“方向性”来快速得到下一个排列。然而当任意给定一个排列数,想恢复每个数字的方向性相对比较麻烦。邻位对换法的关键就在于方向性。

映射方法:我们需要确定每一个数字的方向性,从2开始。同时,设定b2b3b4b5b6b7b8b9为我们要求的中介数。2的方向一定是向左(关于向左原因的讨论这里省略)。b2就是从2开始,背向2的方向直到排列的边界比2小的数字。知道了b2的值之后就可以依次推导出b3b4……直到b9的值,规则如下:对于每一个大于2的数字i,如果i为奇数,其方向性决定于b i-1的奇偶性,奇向右、偶向左。如果i为偶数,其方向性决定于b i-1+b i-2的奇偶性,同样是奇向右、偶向左。当得到方向性后,b i的值就是背向i的方向直到排列边界这个区间里比i小的数字的个数。如此就能得到邻位对换法的中间数。例如对于排列839647521:

2的方向向左,背向2的方向中比2小的数字有1个,b2=1

3的方向由b2为奇可以断定向右,背向3的方向中比3小的数字有0个,b3=0

4的方向由b2+b3为奇可以断定向右,背向4的方向中比4小的数字有1个,b4=1

5的方向由b4为奇可以断定向右,背向5的方向中比5小的数字有2个,b5=2

6的方向由b4+b5为奇可以断定向右,背向6的方向中比6小的数字有1个,b6=1

7的方向由b6为奇可以断定向右,背向7的方向中比7小的数字有3个,b7=3

8的方向由b6+b7为偶可以断定向左,背向8的方向中比8小的数字有7个,b8=7

9的方向由b8为奇可以断定向右,背向9的方向中比9小的数字有2个,b9=2

最终得到中介数10121372(此中介数加上100的递减数131后得到新的中介数10121523)

还原方法:还原方法完全为映射方法的逆过程。当我们知道了b2b3b4b5b6b7b8b9,自然而然就可以得到每个数字的方向性,具体规则同上。我们先画9个空格,以从9到2的填充顺序依次计算他们的位置。每个数字数格的方向就是那个数字的方向。例如如果一个数字i的方向性是向右,则从空格的左侧起向右数b i个未占用的空格,在第b i+1个未占用空格里填上i。例如对于中介数10121523,还原步骤如下:

9的方向由b8为偶知道向左,从空格右起向左数3个空格,在第4个空格填上9。_ _ _ _ _ 9 _ _ _ ←

8的方向由b6+b7为偶知道向左,从空格左起数2个空格,在第3个空格上填上8。_ _ _ _ _ 9 8 _ _ ←

7的方向由b6为奇知道向右,从空格左起向右数5个空格,在第6个空格填上7。→_ _ _ _ _ 9 8 7 _

6的方向由b4+b5为奇知道向右,从空格左起数1个空格,在第2个空格上填上6。→_ 6 _ _ _ 9 8 7 _

5的方向由b4为奇知道向右,从空格左起向右数2个空格,在第3个空格填上5。→_ 6 _ 5 _ 9 8 7 _

4的方向由b2+b3为奇知道向右,从空格左起数1个空格,在第2个空格上填上4。→_ 6 4 5 _ 9 8 7 _

3的方向由b2为奇知道向右,从空格左起向右数0个空格,在第1个空格填上3。→ 3 6 4 5 _ 9 8 7 _

2的方向必为向左,从空格右起向左数1个空格,再第2个空格上填上2。3 6 4 5 2 9 8 7 _ ←

最后补上1,得到最终结果364529871。

循环左右移全排列生成算法

循环左右移法结合了循环左移的循环区间思想和邻位对换的数字方向性思想。在循环左右移全排列生成算法当中,也是要首先确定数字的方向性。数字的方向性决定了搜索区间到底是左循环区间还是右循环区间。

映射方法:我们需要确定每一个数字的方向性,从2开始。同时,设定b2b3b4b5b6b7b8b9为我们要求的中介数。对于每一个小于9的数i,如果i为奇数,其方向性决定于b i-1的奇偶性,奇向右、偶向左。如果i为偶数,其方向性决定于i-1+b i-2的奇偶性,同样是奇向右、偶向左(当i=2时,方向一定向左)。确定方向性后,就要构造一个以i开始,以i+1为结束的循环区间,此循环区间的方向是背向i的方向。在此区间里比i小的数字个数就是b i的值。但到计算b9时是没法构造循环空间的,b9的值就是背向9的方向到排列数字边界之间比9小的数字的个数(在此退化为邻位对换法)。例如对于排列839647521:

2的方向向左,背向2的方向到3的循环区间(1 8)里向中比2小的数字有1个,b2=1

3的方向由b2为奇可以断定向右,背向3的方向到4的循环区间(8 1 2 5 7)中比3小的数字有2个,b3=2

4的方向由b2+b3为奇可以断定向右,背向4的方向到5的循环区间(6 9 3 8 1 2)中比4小的数字有3个,b4=3

5的方向由b4为奇可以断定向右,背向5的方向到6的循环区间(7 4)中比5小的数字有1个,b5=1

6的方向由b4+b5为偶可以断定向左,背向6的方向到7的循环区间(4)中比6小的数字有1个,b6=1

7的方向由b6为奇可以断定向右,背向7的方向到8的循环区间(4 6 9 3)中比7小的数字有3个,b7=3

8的方向由b6+b7为偶可以断定向左,背向8的方向到9的循环区间(3)中比8小的数字有1个,b8=1

9的方向由b8为奇可以断定向右,背向9的方向到排列边界(3 8)中比9小的数字有2个,b9=2

最后得到中介数12311312(此中介数加上100的递减数131得到新的中介数12311443)。

还原方法:当我们知道了b2b3b4b5b6b7b8b9,自然而然就可以得到每个数字的方向性,具体规则同上。我们先画9个空格,以从9到2的填充顺序依次计算他们的位置。数格的方向除了9是从排列边界沿着9的方向之外,其它的数字都是以上一个数字开始,沿着此数字的方向对未占用空格的格数进行循环计数。例如对于新中介数12311443,还原步骤如下:

9的方向由b8为偶知道向左,从空格右起向左数3个空格,在第4个空格填上9。_ _ _ _ _ 9 _ _ _ ←

8的方向由b6+b7为奇知道向右,从9所在位置向右循环数4个空格,在第5个空格上填上8。→_ 8 _ _ _ 9 _ _ _

7的方向由b6为奇知道向右,从8所在位置向右循环数4个空格,在第5个空格填上7。→_ 8 _ _ _ 9 _ 7 _

6的方向由b4+b5为偶知道向左,从7所在位置向左循环数1个空格,在第2个空格上填上6。_ 8 _ _ 6 9 _ 7 _ ←

5的方向由b4为奇知道向右,从6所在位置向右循环数1个空格,在第2个空格填上5。→_ 8 _ _ 6 9 _ 7 5

4的方向由b2+b3为奇知道向右,从5所在位置向右循环数3个空格,在第4个空格上填上4。→_ 8 _ _ 6 9 4 7 5

3的方向由b2为奇知道向右,从4所在位置向右循环数2个空格,在第3个空格填上3。→

_ 8 _ 3 6 9 4 7 5

2的方向必为向左,从3所在位置向左循环数1个空格,再第2个空格上填上2。2 8 _ 3 6 9 4 7 5 ←

最后补上1,得到最终结果281369475。

结论

我们从这六种全排列生成算法可以看出这些方法实际上都是将排列数映射到递增/递减进位制的中介数,只是映射的策略略有不同而已。同时,不难发现很多映射和还原方法的细则都是硬性规定的(例如,求每一个数右侧比这个数小的数字个数,而不是左侧;循环左移,循环左右移采用递减进位制数,而不是递增进位制数,作为中介数等)实际上,这些规定仅仅与我们的考试相符

而已。不同的组合可以衍生出许许多多不同的算法。在任何一个关于排列生成算法的综述上都会有超过50种的算法。此外,可以看到像邻位对换和循环左右移这样的算法特别适合连续生成排列数,但在生成指定序号的排列上比较复杂;但递增/递减进位法则无法快速的连续生成排列数。这样,算法的不同优势造就了其不同的适用环境。最后希望大家能够通过了解这6种算法来提高自己结合现有思想,创造新方法的能力和经验。

排 列 组 合 公 式 及 排 列 组 合 算 法

排列组合n选m,组合算法——0-1转换算法(巧妙算法)C++实现 知识储备 排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示计算公式: 注意:m中取n个数,按照一定顺序排列出来,排列是有顺序的,就算已经出现过一次的几个数。只要顺序不同,就能得出一个排列的组合,例如1,2,3和1,3,2是两个组合。 组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。 计算公式: 注意:m中取n个数,将他们组合在一起,并且顺序不用管,1,2,3和1,3,2其实是一个组合。只要组合里面数不同即可 组合算法 本算法的思路是开两个数组,一个index[n]数组,其下标0~n-1表示1到n个数,1代表的数被选中,为0则没选中。value[n]数组表示组合

的数值,作为输出之用。 ? 首先初始化,将index数组前m个元素置1,表示第一个组合为前m 个数,后面的置为0。? 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为?“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。一起得到下一个组合(是一起得出,是一起得出,是一起得出)重复1、2步骤,当第一个“1”移动到数组的n-m的位置,即m个“1”全部移动到最右端时;即直到无法找到”10”组合,就得到了最后一个组合。 组合的个数为: 例如求5中选3的组合: 1 1 1 0 0 --1,2,3? 1 1 0 1 0 --1,2,4? 1 0 1 1 0 --1,3,4? 0 1 1 1 0 --2,3,4? 1 1 0 0 1 --1,2,5? 1 0 1 0 1 --1,3,5? 0 1 1 0 1 --2,3,5? 1 0 0 1 1 --1,4,5? 0 1 0 1 1 --2,4,5? 0 0 1 1 1 --3,4,5 代码如下:

初中排列组合公式例题.

复习排列与组合 考试内容:两个原理;排列、排列数公式;组合、组合数公式。 考试要求:1)掌握加法原理及乘法原理,并能用这两个原理分析和解决一些简单的问题。 2)理解排列、组合的意义。掌握排列数、组合数的计算公式,并能用它们解决一些简单的问题。 重点:两个原理尤其是乘法原理的应用。 难点:不重不漏。 知识要点及典型例题分析: 1.加法原理和乘法原理 两个原理是理解排列与组合的概念,推导排列数及组合数公式,分析和解决排列与组合的应用问题的基本原则和依据;完成一件事共有多少种不同方法,这是两个原理所要回答的共同问题。而两者的区别在于完成一件事可分几类办法和需要分几个步骤。 例1.书架上放有3本不同的数学书,5本不同的语文书,6本不同的英语书。 (1)若从这些书中任取一本,有多少种不同的取法? (2)若从这些书中取数学书、语文书、英语书各一本,有多少种不同的取法? (3)若从这些书中取不同的科目的书两本,有多少种不同的取法。 解:(1)由于从书架上任取一本书,就可以完成这件事,故应分类,由于有3种书,则分为3类然后依据加法原理,得到的取法种数是:3+5+6=14种。 (2)由于从书架上任取数学书、语文书、英语书各1本,需要分成3个步骤完成,据乘法原理,得到不同的取法种数是:3×5×6=90(种)。 (3)由于从书架上任取不同科目的书两本,可以有3类情况(数语各1本,数英各1本,语英各1本)而在每一类情况中又需分2个步骤才能完成。故应依据加法与乘法两个原理计算出共得到的不同的取法种数是:3×5+3×6+5×6=63(种)。 例2.已知两个集合A={1,2,3},B={a,b,c,d,e},从A到B建立映射,问可建立多少个不同的映射? 分析:首先应明确本题中的“这件事是指映射,何谓映射?即对A中的每一个元素,在B中都有唯一的元素与之对应。” 因A中有3个元素,则必须将这3个元素都在B中找到家,这件事才完成。因此,应分3个步骤,当这三个步骤全进行完,一个映射就被建立了,据乘法原理,共可建立不同的映射数目为:5×5×5=125(种)。 2.排列数与组合数的两个公式 排列数与组合数公式各有两种形式,一是连乘积的形式,这种形式主要用于计算;二是阶乘的形式,这种形式主要用于化简与证明。 连乘积的形式阶乘形式 Anm=n(n-1)(n-2)……(n-m+1) = Cnm= 例3.求证:Anm+mAnm-1=An+1m 证明:左边= ∴等式成立。 评述:这是一个排列数等式的证明问题,选用阶乘之商的形式,并利用阶乘的性质:n!(n+1)=(n+1)!可使变形

高中数学排列组合难题十一种方法

高考数学排列组合难题解决方法 1.分类计数原理(加法原理) 完成一件事,有n 类办法,在第1类办法中有1m 种不同的方法,在第2类办法中有2m 种不同的方法,…,在第n 类办法中有n m 种不同的方法,那么完成这件事共有: 12n N m m m =+++ 种不同的方法. 2.分步计数原理(乘法原理) 完成一件事,需要分成n 个步骤,做第1步有1m 种不同的方法,做第2步有2m 种不同的方法,…,做第n 步有n m 种不同的方法,那么完成这件事共有: 12n N m m m =??? 种不同的方法. 3.分类计数原理分步计数原理区别 分类计数原理方法相互独立,任何一种方法都可以独立地完成这件事。 分步计数原理各步相互依存,每步中的方法完成事件的一个阶段,不能完成整个事件. 解决排列组合综合性问题的一般过程如下: 1.认真审题弄清要做什么事 2.怎样做才能完成所要做的事,即采取分步还是分类,或是分步与分类同时进行,确定分多少步及多少类。 3.确定每一步或每一类是排列问题(有序)还是组合(无序)问题,元素总数是多少及取出多少个元素. 4.解决排列组合综合性问题,往往类与步交叉,因此必须掌握一些常用的解题策略 一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有13C 然后排首位共有1 4C 最后排其它位置共有34A 由分步计数原理得113 4 34288C C A = C 14A 34C 13 位置分析法和元素分析法是解决排列组合问题最常用也是最基本的方法,若以元素分析为主,需先安排特殊元素,再处理其它元素.若以位置分析为主,需先满足特殊位置的要求,再处理其它位置。若有多个约束条件,往往是考虑一个约束条件的同时还要兼顾其它条件

排 列 组 合 公 式 及 排 列 组 合 算 法 ( 2 0 2 0 )

字符串的排列组合算法合集 全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。 首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,如 abc 的全排列: abc, acb, bca, dac, cab, cba 一、全排列的递归实现 为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了: view plaincopy #includeiostream?using?namespace?std;?#includeassert.h?v oid?Permutation(char*?pStr,?char*?pBegin)?{?assert(pStr?pBe

gin);?if(*pBegin?==?'0')?printf("%s",pStr);?else?{?for(char *?pCh?=?pBegin;?*pCh?!=?'0';?pCh++)?{?swap(*pBegin,*pCh);?P ermutation(pStr,?pBegin+1);?swap(*pBegin,*pCh);?}?}?}?int?m ain(void)?{?char?str[]?=?"abc";?Permutation(str,str);?retur n?0;?}? 另外一种写法: view plaincopy --k表示当前选取到第几个数,m表示共有多少个数?void?Permutation(char*?pStr,int?k,int?m)?{?assert(pStr); ?if(k?==?m)?{?static?int?num?=?1;?--局部静态变量,用来统计全排列的个数?printf("第%d个排列t%s",num++,pStr);?}?else?{?for(int?i?=?k;?i?=?m;?i++)?{?swa p(*(pStr+k),*(pStr+i));?Permutation(pStr,?k?+?1?,?m);?swap( *(pStr+k),*(pStr+i));?}?}?}?int?main(void)?{?char?str[]?=?" abc";?Permutation(str?,?0?,?strlen(str)-1);?return?0;?}? 如果字符串中有重复字符的话,上面的那个方法肯定不会符合要求的,因此现在要想办法来去掉重复的数列。二、去掉重复的全排列的递归实现 由于全排列就是从第一个数字起每个数分别与它后面的数字交换。我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这二个数就不交换了。如122,第一个数与后面交换得212、221。然后122中第二数就不用与第三个数交换了,但对212,它第二个数

高中数学排列组合公式排列组合计算公式.

排列组合公式/排列组合计算公式 排列P------和顺序有关 组合C -------不牵涉到顺序的问题 排列分顺序,组合不分 例如把5本不同的书分给3个人,有几种分法. "排列" 把5本书分给3个人,有几种分法"组合" 1.排列及计算公式 从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 p(n,m)表示. p(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(规定0!=1). 2.组合及计算公式 从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号 c(n,m) 表示. c(n,m)=p(n,m)/m!=n!/((n-m)!*m!);c(n,m)=c(n,n-m); 3.其他排列与组合公式 从n个元素中取出r个元素的循环排列数=p(n,r)/r=n!/r(n-r)!. n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为 n!/(n1!*n2!*...*nk!). k类元素,每类的个数无限,从中取出m个元素的组合数为c(m+k-1,m). 排列(Pnm(n为下标,m为上标)) Pnm=n×(n-1)....(n-m+1);Pnm=n!/(n-m)!(注:!是阶乘符号);Pnn (两个n分别为上标和下标) =n!;0!=1;Pn1(n为下标1为上标)=n 组合(Cnm(n为下标,m为上标))

高中数学-排列组合解法大全

排列组合解法大全 复习巩固 1.分类计数原理(加法原理) 完成一件事,有n类办法,在第 1类办法中有m1种不同的方法,在第 2 类办法中有m2种不同的方法,?,在第n 类办法中有m n种不同的方法,那么完成这件事共有: 种不同的方法. 2.分步计数原理(乘法原理) 完成一件事,需要分成n个步骤,做第 1步有m1种不同的方法,做第 2步有m2种不同的方法,做第n步有m n种不同的方法,那么完成这件事共有: 种不同的方法. 3.分类计数原理分步计数原理区别分类计数原理方法相互独立,任何一种方法都可以独立地完成这件事。分步计数原理各步相互依存,每步中的方法完成事件的一个阶段,不能完成整个事件. 解决排列组合综合性问题的一般过程如下 : 1.认真审题弄清要做什么事 2.怎样做才能完成所要做的事 , 即采取分步还是分类 , 或是分步与分类同时进行 , 确定分多少步及多少类。 3.确定每一步或每一类是排列问题(有序)还是组合(无序)问题, 元素总数是多少及取出多少个元素 . 4.解决排列组合综合性问题,往往类与步交叉,因此必须掌握一些常用的解题策略 一. 特殊元素和特殊位置优先策略 例 1. 由 0,1,2,3,4,5 可以组成多少个没有重复数字五位奇数 . 解: 由于末位和首位有特殊要求 , 应该优先安排 , 以免不合要求的元素占了这两个位置 . 先排末位共有C13 然后排首位共有C14 最后排其它位置共有A43 由分步计数原理得C41C13A43 288 练习题 :7 种不同的花种在排成一列的花盆里 , 若两种葵花不种在中间,也不种在两端的花盆里,问有多少不同的种法? 二. 相邻元素捆绑策略 例 2. 7 人站成一排 , 其中甲乙相邻且丙丁相邻 , 共有多少种不同的排法 . 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素部进行自排。由分步计数原理可得共有A55A22A22480种不同的排法 练习题 : 某人射击 8 枪,命中 4 枪, 4 枪命中恰好有 3 枪连在一起的情形的不同种数为20

补充全排列算法C语言实现

字符串全排列算法C语言实现 问题描述: 输入一个字符串,打印出该字符串中字符的所有排列。 输入: 123 输出: 123 132 213 231 312 321 问题分析: 现象分析: 这种问题,从直观感觉就是用递归方法来实现即:把复杂问题逐渐简单化,进而得出具体代码实现。(如何发现一个问题可以使用递归方式来解决?经分析可以发现:M 个数的排列方法与N(N>M)个数的排列方法没有区别,处理方法与数据的个数没有关系。 处理方法的一致性,就可以采用递归)。 3个数(123)排列,第一位1不动,剩下两个数(23)的排列,只要相互颠倒一下,就可以出现关于1开头的所有排列 123 132 把2换到第一位,保持不动,剩下的两个数(13)的排列,只要相互颠倒一下,就可以出现关于2开头的所有排列 213 231 同理,把3换到第一位,可得到 312 321 扩展: 把3个数的所有排列,前面加一个4,就可以得到关于4开头的所有的排列4123 4132 4213 4231 4312 4321 若把4与后续数据中的任意一个数据交换,通过完成对后续三个数的全排列,就可以得到相应的数开头的四数的排列。 总结: 对4个数的排列,可以转换成首位不动,完成对3个数的排列 对3个数的排列,可以转换成首位不动,完成对2个数的排列 对2个数的排列,可以转换成首位不动,完成对1个数的排列 对于1个数,无排列,直接输出结果 算法实现说明:

对n个数的排列,分成两步: (1)首位不动,完成对n-1个数的排列, (2)循环将后续其他数换到首位,再次进行n-1个数的排列 注:排列完成后,最终的串要与原串相同 C语言代码实现: #include #include //将串左移一位,首位存到末尾。 void shift( char *s ) { if ( !s||!s[0] ) return ; //security code . null string char ch=s[0]; int i=0; while( s[++i] ) s[i-1]=s[i] ; s[i-1]=ch; } //本函数对于一个已排序好的数据进行全排列 void permutation(char list[], int head ) { int i,len; len=strlen(list) ; if ( len-head == 1 ) //后续没有再排列的,则输出排列数据 { printf( "%s\n", list ); } else { for (i = k; i

排列组合公式排列组合计算公式----高中数学!

排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取R个进行排列。 公式C是指组合,从N个元素取R个,不进行排列。 N-元素的总个数 R参与选择的元素个数 !-阶乘,如9!=9*8*7*6*5*4*3*2*1 从N倒数r个,表达式应该为n*(n-1)*(n-2)..(n-r+1); 因为从n到(n-r+1)个数为n-(n-r+1)=r 举例: Q1:有从1到9共计9个号码球,请问,可以组成多少个三位数? A1: 123和213是两个不同的排列数。即对排列顺序有要求的,既属于“排列P”计算范畴。 上问题中,任何一个号码只能用一次,显然不会出现988,997之类的组合,我们可以这么看,百位数有9种可能,十位数则应该有9-1种可能,个位数则应该只有9-1-1种可能,最终共有9*8*7个三位数。计算公式=P(3,9)=9*8*7,(从9倒数3个的乘积) Q2: 有从1到9共计9个号码球,请问,如果三个一组,代表“三国联盟”,可以组合成多少个“三国联盟”? A2: 213组合和312组合,代表同一个组合,只要有三个号码球在一起即可。即不要求顺序的,属于“组合C”计算范畴。 上问题中,将所有的包括排列数的个数去除掉属于重复的个数即为最终组合数C(3,9)=9*8*7/3*2*1 排列、组合的概念和公式典型例题分析 例1设有3名学生和4个课外小组.(1)每名学生都只参加一个课外小组;(2)每

名学生都只参加一个课外小组,而且每个小组至多有一名学生参加.各有多少种不同方法? 解(1)由于每名学生都可以参加4个课外小组中的任何一个,而不限制每个课外小组的人数,因此共有种不同方法. (2)由于每名学生都只参加一个课外小组,而且每个小组至多有一名学生参加,因此共有种不同方法. 点评由于要让3名学生逐个选择课外小组,故两问都用乘法原理进行计算. 例2 排成一行,其中不排第一,不排第二,不排第三,不排第四的不同排法共有多少种? 解依题意,符合要求的排法可分为第一个排、、中的某一个,共3类,每一类中不同排法可采用画“树图”的方式逐一排出: ∴ 符合题意的不同排法共有9种. 点评按照分“类”的思路,本题应用了加法原理.为把握不同排法的规律,“树图”是一种具有直观形象的有效做法,也是解决计数问题的一种数学模型. 例3判断下列问题是排列问题还是组合问题?并计算出结果. (1)高三年级学生会有11人:①每两人互通一封信,共通了多少封信?②每两人互握了一次手,共握了多少次手? (2)高二年级数学课外小组共10人:①从中选一名正组长和一名副组长,共有多少种不同的选法?②从中选2名参加省数学竞赛,有多少种不同的选法? (3)有2,3,5,7,11,13,17,19八个质数:①从中任取两个数求它们的商可以有多少种不同的商?②从中任取两个求它的积,可以得到多少个不同的积? (4)有8盆花:①从中选出2盆分别给甲乙两人每人一盆,有多少种不同的选法?②从中选出2盆放在教室有多少种不同的选法? 分析(1)①由于每人互通一封信,甲给乙的信与乙给甲的信是不同的两封信,所以与顺序有关是排列;②由于每两人互握一次手,甲与乙握手,乙与甲握手是同一次握手,与顺序无关,所以是组合问题.其他类似分析. (1)①是排列问题,共用了封信;②是组合问题,共需握手(次). (2)①是排列问题,共有(种)不同的选法;②是组合问题,共有种不同的选法. (3)①是排列问题,共有种不同的商;②是组合问题,共有种不同的积. (4)①是排列问题,共有种不同的选法;②是组合问题,共有种不同的选法. 例4证明. 证明左式

全排列生成算法

全排列的生成算法对于给左的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。字典序法按照字典序求下一个排列的算法广例字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321o注意一个全排列可看做一个字符串,字符串可有前缀、后缀/生成给泄全排列的下一个排列所谓一个全排列的下一个排列就是这一个排列与下一个排列之间没有其他的排列。这就要求这一个排列与下一个排列有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。广例839647521是1—9的排列。1—9的排列最前而的是123456789,最后而的是987654321,从右向左扫描若都是增的,就到了987654321,也就没有下一个了。否则找出第一次出现下降的位置。算法:由P1P2...Pn生成的下一个排列的算法如下:1求j=max{j| Pj-I

排列组合的数学公式

排列组合的数学公式 排列组合的数学公式 1. 排列及计算公式从n 个不同元素中,任取m(m≤n) 个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m 个宝鸡博瀚教 育元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号p(n,m) 表示. p(n,m)=n(n-1)(n- 2) ...... (n -m+1)= n!/(n-m)!( 规定 0!=1). 2. 组合及计算公式 从n 个不同元素中,任取m(m≤n) 个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不 同元素中取出m(m≤n) 个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号 c(n,m) 表示. c(n,m)=p(n,m)/m!=n!/((n-m)!*m!);c(n,m)=c(n,n-m); 3. 其他排列与组合公式 从n 个元素中取出r 个元素的循环排列数=p(n,r)/r=n!/r(n-r)!.

n 个元素被分成k 类,每类的个数分别是n1,n2,...nk 这 n 个元素的全排列数为n!/(n1!*n2!*...*nk!). k 类元素, 每类的个数无限, 从中取出m 个元素的组合数为c(m+k-1,m). 排列(Pnm(n为下标,m为上标)) Pnm=n×(n-1)(n- m+1);Pnm=n!/(n-m)!(注:是阶乘符号);Pnn(两个n 分别为上标和下标) =n!;0!=1;Pn1(n 为下标1 为上标)=n 组合(Cnm(n为下标,m为上标)) Cnm=Pnm/Pmm ;Cnm=n!/m!(n-m)!;Cnn(两个n 分别为上标和下标) =1 ;Cn1(n 为下标 1 为上标)=n;Cnm=Cnn-m 排列组合的数学解题技巧 1. 掌握分类计数原理与分步计数原理,并能用它们分析和解决一些简单的应用问题。 2. 理解排列的意义,掌握排列数计算公式,并能用它解决一些简单的应用问题。 3. 理解组合的意义,掌握组合数计算公式和组合数的性质,并能用它们解决一些简单的应用问题。 4. 掌握二项式定理和二项展开式的性质,并能用它们计算和证明一些简单的问题。

(完整)高中数学排列组合专题复习

高考数学轻松搞定排列组合难题二十一种方法 排列组合问题联系实际生动有趣,但题型多样,思路灵活,因此解决排列组合问题,首先要认真审题,弄清楚是排列问题、组合问题还是排列与组合综合问题;其次要抓住问题的本质特征,采用合理恰当的方法来处理。 教学目标 1.进一步理解和应用分步计数原理和分类计数原理。 2.掌握解决排列组合问题的常用策略;能运用解题策略解决简单的综合应用题。提高学生解决问题分析问题的能力 3.学会应用数学思想和方法解决排列组合问题. 复习巩固 1.分类计数原理(加法原理) 完成一件事,有n类办法,在第1类办法中有 m种不同的方法,在第2类 1 办法中有 m种不同的方法,…,在第n类办法中有n m种不同的方法,那么2 完成这件事共有: 种不同的方法. 2.分步计数原理(乘法原理) 完成一件事,需要分成n个步骤,做第1步有 m种不同的方法,做第2步 1 有 m种不同的方法,…,做第n步有n m种不同的方法,那么完成这件事共2 有: 种不同的方法. 3.分类计数原理分步计数原理区别 分类计数原理方法相互独立,任何一种方法都可以独立地完成这件事。分步计数原理各步相互依存,每步中的方法完成事件的一个阶段,不能完成整个事件. 解决排列组合综合性问题的一般过程如下: 1.认真审题弄清要做什么事 2.怎样做才能完成所要做的事,即采取分步还是分类,或是分步与分类同时进行,确定分多少步及多少类。 3.确定每一步或每一类是排列问题(有序)还是组合(无序)问题,元素总数是多少及取出多少个元素. 4.解决排列组合综合性问题,往往类与步交叉,因此必须掌握一些常用的解题策略 一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排, 两个位置.

排 列 组 合 公 式 及 排 列 组 合 算 法

排列组合——排列公式的推理和组合 加法原理和乘法原理,是排列组合中的二条基本原理,在解决计数问题中经常运用。掌握这两条原理,并能正确区分他们,至关重要。 加法原理 若完成一件事情有3类方式,其中第一类方式有1种方法,第二类方式有3种方法,第三类有2种方法,这些方法都不相同,但任选一种方法都可以完成此事,则完成这件事情共有1+3+2=6种方法,这一原理称为加法原理。例如:从甲地到乙地有三类方式,一是汽车,二是火车,三是飞机。若一天中汽车有2班,火车有4班,飞机有一班,那么从甲地到乙地共有多少种不同的走法。共有2+4+1=7种。 乘法原理 若完成一件事情分r个步骤,其中第一个步骤有m1种方法,第二个步骤有m2种方法……第步骤共有mr种方法,各步骤连续或同时完成,这件事才算完成,则完成这件事共有m1*m2*……*mr种方法。例如:从甲地到丙地必须经过乙地。从甲地到乙地有4条路线,从乙地到丙地有3条路线,问从甲地到丙地共有多少种不同的走法?解:要从甲地到达丙地,必须经过两个步骤:先从甲地到乙地,有4条路线;再从乙地到丙地,有3条路线。只有这两个步骤都完成了,才能完成这种事情,缺少哪一个步骤都不行。因此从甲地到丙地共有4*3=12种走法。 加法原理和乘法原理的区别

以上两个基本原理在排列组合问题中将会反复使用。这两个原理回答的都是关于完成一件事情的不同方法的种数问题,但是又有根本区别。加法原理针对的是“分类”问题,若完成一件事情有多类方式,每一类方式的各种方法相互独立,用其中任何一种方法都可以完成这件事情,则用加法原理;而乘法原理针对的是“分步”问题,若完成一件事情必须依次经过多个步骤,每一个步骤的各种方法相互依存,只有各种步骤都完成才算做完成这种事情,则这时用乘法原理。 排列数公式推理过程 例:用1、2、3这3个数字可以组成多少个数字十位和个位不重复的两位数?解:要组成数字不重复的两位数,需要经过两个步骤:第一步确定十位上的数,数字1、2、3都可以放在十位上,共有3种方法;第二步确定个位上的数,因为要求个位数与十位数不能重复,所以个位上的数,只能从三个数字中去掉十位数后所剩的两个数字中任选一个,共有2种方法。只有十位和个位上的数都确定了,才能组成数字不重复的两位数,这两个步骤缺少哪一个都不行。因此,根据乘法原理,3*2=6. 上例中,我们把数字1、2、3称为元素。组成数字不重复的两位数这个问题,从3个不同的元素中任取2个,然后按顺序排成一列数,由于这样的排列与数字不重复的两位数是一一对应的,因此求数字不重复的两位数的个数等同于求这样的排列个数。 推理过程:从n个不同元素中取出m个不同元素排成一列,必须经过m 个步骤。第一步,确定第1个位置上的元素,可以从这n个元素中任取1个放在这个位置上,共有n种方法,即n-(1-1)括号内为位置数减1;第

排列组合公式

排列组合公式 1.分类计数原理(加法原理) 12n N m m m =+++ . 2.分步计数原理(乘法原理) 12n N m m m =??? . 3.排列数公式 m n A =)1()1(+--m n n n =!! )(m n n -.(n ,m ∈N*,且m n ≤). 注:规定1!0=. 4.排列恒等式 (1)1 (1)m m n n A n m A -=-+; (2) 1 m m n n n A A n m -= -; (3) 1 1m m n n A nA --=; (4)11n n n n n n nA A A ++=-; (5)11m m m n n n A A mA -+=+. (6) 1!22!33!!(1)!1n n n +?+?++?=+- . 5.组合数公式 m n C =m n m m A A =m m n n n ???+-- 21)1()1(=!!!)(m n m n -?(n ∈N*,m N ∈,且m n ≤). 6.组合数的两个性质 (1)m n C =m n n C - ; (2) m n C +1-m n C =m n C 1+. 注:规定 10 =n C . 7.组合恒等式 (1) 1 1m m n n n m C C m --+= ;

(2) 1 m m n n n C C n m -= -; (3) 1 1m m n n n C C m --= ; (4)∑=n r r n C =n 2; (5) 1121++++=++++r n r n r r r r r r C C C C C . (6)n n n r n n n n C C C C C 2210=++++++ . (7)14205312-+++=+++n n n n n n n C C C C C C . (8)1321232-=++++n n n n n n n nC C C C . (9) r n m r n r m n r m n r m C C C C C C C +-=+++0110 . (10)n n n n n n n C C C C C 22222120)()()()(=++++ . 8.排列数与组合数的关系 m m n n A m C =?! . 9.单条件排列 以下各条的大前提是从n 个元素中取m 个元素的排列. (1)“在位”与“不在位” ①某(特)元必在某位有11--m n A 种; ②某(特)元不在某位有11---m n m n A A (补集思想)1 111---=m n n A A (着眼位置)1 1111----+=m n m m n A A A (着眼元素)种. (2)紧贴与插空(即相邻与不相邻) ①定位紧贴:)(n m k k ≤≤个元在固定位的排列有k m k n k k A A --种. ②浮动紧贴:n 个元素的全排列把k 个元排在一起的排法有k k k n k n A A 1 1+-+-种. 注:此类问题常用捆绑法; ③插空:两组元素分别有k 、h 个(1+≤h k ),把它们合在一起来作全排列,k 个的 一组互不能挨近的所有排列数有 k h h h A A 1+种. (3)两组元素各相同的插空

高中数学排列组合专题

排列组合 一.选择题(共5小题) 1.甲、乙、丙三同学在课余时间负责一个计算机房的周一至周六的值班工作,每天1人值班,每人值班2天,如果甲同学不值周一的班,乙同学不值周六的班,则可以排出不同的值班表有() A.36种B.42种C.50种D.72种 2.某城市的街道如图,某人要从A地前往B地,则路程最短的走法有() A.8种 B.10种C.12种D.32种 3.某次联欢会要安排3个歌舞类节目,2个小品类节目和1个相声类节目的演出顺序,则同类节目不相邻的排法种数是() A.72 B.120 C.144 D.168 4.现将甲乙丙丁4个不同的小球放入A、B、C三个盒子中,要求每个盒子至少放1个小球,且小球甲不能放在A盒中,则不同的放法有() A.12种B.24种C.36种D.72种 5.从6人中选4人分别到巴黎、伦敦、悉尼、莫斯科四个城市游览,要求每个城市有一人游览,每人只游览一个城市,且这6人中甲、乙两人不去巴黎游览,则不同的选择方案共有() A.300种B.240种C.144种D.96种 二.填空题(共3小题) 6.某排有10个座位,若4人就坐,每人左右两边都有空位,则不同的坐法有种. 7.四个不同的小球放入编号为1,2,3的三个盒子中,则恰有一个空盒的放法共有种(用数字作答). 8.书架上原来并排放着5本不同的书,现要再插入3本不同的书,那么不同的

插法共有种. 三.解答题(共8小题) 9.一批零件有9个合格品,3个不合格品,组装机器时,从中任取一个零件,若取出不合格品不再放回,求在取得合格品前已取出的不合格品数的分布列10.已知展开式的前三项系数成等差数列. (1)求n的值; (2)求展开式中二项式系数最大的项; (3)求展开式中系数最大的项. 11.设f(x)=(x2+x﹣1)9(2x+1)6,试求f(x)的展开式中: (1)所有项的系数和; (2)所有偶次项的系数和及所有奇次项的系数和. 12.求(x2+﹣2)5的展开式中的常数项. 13.求值C n5﹣n+C n+19﹣n. 14.3名男生,4名女生,按照不同的要求排队,求不同的排队方案的种数.(1)选5名同学排成一行; (2)全体站成一排,其中甲只能在中间或两端; (3)全体站成一排,其中甲、乙必须在两端; (4)全体站成一排,其中甲不在最左端,乙不在最右端; (5)全体站成一排,男、女各站在一起; (6)全体站成一排,男生必须排在一起; (7)全体站成一排,男生不能排在一起; (8)全体站成一排,男、女生各不相邻; (9)全体站成一排,甲、乙中间必须有2人; (10)全体站成一排,甲必须在乙的右边; (11)全体站成一排,甲、乙、丙三人自左向右顺序不变; (12)排成前后两排,前排3人,后排4人. 15.用1、2、3、4、5、6共6个数字,按要求组成无重复数字的自然数(用排列数表示).

c语言递归算法实现数列全排列

1、数列全排列递归算法; 2、在不打印所有全排列时,数列长度分别为10、11、12、13时全排列花费时间测试,修改N的值重新编译即可运行测试; 3、如果需要打印全排列,打开perm函数中的注释掉的两行printf语句即可。

#include #define N 10 int a[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; void swap(int one, int two) { int tmp = a[one]; a[one] = a[two]; a[two] = tmp; } void perm(int *list, int begin, int end)

{ int i = 0; if (begin == end){ for ( i = 0; i < N ; i++){ //printf("%d", list[i]); } //printf("\n"); } else{ for (i = begin; i <= end; i++) { swap(begin,i); perm(list,begin+1,end); swap(begin,i); } } } int main(int argc, char *argv[]) { int *list=a; int i; perm(list, 0, N-1); for (i = 0; i < N; i++){ printf("%d", list[i]); } return 0; }

排列组合的基本理论和公式

排列组合的基本理论和公式 排列与元素的顺序有关,组合与顺序无关.如231与213是两个排列,2+3+1的和与2+1+3的和是一个组合. (一)两个基本原理是排列和组合的基础 (1)加法原理:做一件事,完成它可以有n类办法,在第一类办法中有m1种不同的方法,在第二类办法中有m2种不同的方法,……,在第n类办法中有mn种不同的方法,那么完成这件事共有N=m1+m2+m3+…+mn种不同方法. (2)乘法原理:做一件事,完成它需要分成n个步骤,做第一步有m1 种不同的方法,做第二步有m2种不同的方法,……,做第n步有mn种不同的方法,那么完成这件事共有N=m1×m2×m3×…×mn种不同的方法.这里要注意区分两个原理,要做一件事,完成它若是有n类办法,是分类问题,第一类中的方法都是独立的,因此用加法原理;做一件事,需要分n个步骤,步与步之间是连续的,只有将分成的若干个互相联系的步骤,依次相继完成,这件事才算完成,因此用乘法原理. 这样完成一件事的分“类”和“步”是有本质区别的,因此也将两个原理区分开来. (二)排列和排列数 (1)排列:从n个不同元素中,任取m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列.从排列的意义可知,如果两个排列相同,不仅这两个排列的元素必须完全相同,而且排列的顺序必须完全相同,这就告诉了我们如何判断两个排列是否相同的方法. (2)排列数公式:从n个不同元素中取出m(m≤n)个元素的所有排列 当m=n时,为全排列Pnn=n(n-1)(n-2)…3·2·1=n! (三)组合和组合数 (1)组合:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n 个不同元素中取出m个元素的一个组合. 从组合的定义知,如果两个组合中的元素完全相同,不管元素的顺序如何,都是相同的组合;只有当两个组合中的元素不完全相同时,才是不同的组合. (2)组合数:从n个不同元素中取出m(m≤n)个元素的所有组合的个

高中数学排列组合经典题型全面总结版

高中数学排列与组合 (一)典型分类讲解 一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排, 先排末位共有1 3C 然后排首位共有1 4C 最后排其它位置共有 34A 由分步计数原理得1 1 3 434 288C C A = 练习题:7种不同的花种在排成一列的花盆里,若两种葵花不种在中间,也不种在两端的花盆里,问有多少不同的种法? 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元 素内部进行自排。由分步计数原理可得共有 522522480A A A =种不同的排法 练习题:某人射击8枪,命中4枪,4枪命中恰好有3枪连在一起的情形的不同种数为 20 三.不相邻问题插空策略 例3.一个晚会的节目有4个舞蹈,2个相声,3个独唱,舞蹈节目不能连续出场,则节目的出场顺序有多少种? 解:分两步进行第一步排2个相声和3个独唱共有55A 种, 第二步将4舞蹈插入第一步排好的6个元素中间包含首尾两个空位共有种 46 A 不同的方法,由分步计数原理,节目的不同顺序共有54 56A A 种 练习题:某班新年联欢会原定的5个节目已排成节目单,开演前又增加了两个新节目.如果将这两个新节目插入原节目单中,且两个新节目不相邻,那么不同插法的种数为 30 四.定序问题倍缩空位插入策略 例4. 7人排队,其中甲乙丙3人顺序一定共有多少不同的排法 解:(倍缩法)对于某几个元素顺序一定的排列问题,可先把这几个元素与其他元素一起进行排列,然后用总排列数除以这几个元素 之间的全排列数,则共有不同排法种数是: 73 73/A A (空位法)设想有7把椅子让除甲乙丙以外的四人就坐共有 47 A 种方法,其余的三个位置甲乙丙共有 1种坐法,则共有4 7A 种方法。 思考:可以先让甲乙丙就坐吗? (插入法)先排甲乙丙三个人,共有1种排法,再把其余4四人依次插入共有 方法 练习题:10人身高各不相等,排成前后排,每排5人,要求从左至右身高逐渐增加,共有多少排法? 5 10C 五.重排问题求幂策略 例5.把6名实习生分配到7个车间实习,共有多少种不同的分法 解:完成此事共分六步:把第一名实习生分配到车间有 7 种分法.把第二名实习生分配到车间也有7种分依此类推,由分步计数原 理共有6 7种不同的排法 练习题: 1. 某班新年联欢会原定的5个节目已排成节目单,开演前又增加了两个新节目.如果将这两个节目插入原节目单中,那么不同插 法的种数为 42 4 4 3 允许重复的排列问题的特点是以元素为研究对象,元素不受位置的约束,可以逐一安排各个元素的位置,一般地n 不同的元素没有限制地安排在m 个位置上的排列数为n m 种

相关主题