组合数学
2.3.1两个基本计数原理
1.加法原理
先看一个简单的例子:从杭州到北京,可以坐火车,也可以乘飞机,每天火车有5趟,飞机有8次航班,那么从杭州到北京有多少种不同的走法?
很显然,从杭州到北京,乘飞机有8种走法,坐火车有5种走法,所以共有13种走法。
加法原理:设完成某一件事,有n类方法,并且在第一类中有m1种方法;在第二类方法中有m2种方法;……;在第n类方法中有mn种方法。则完成这件事情共有N=m1+m2+…+mn种不同的方法。
加法原理有下列特性:
①方法间的相互独立性。即每一种方法都可以独立完成给定的事件;
②方法间的不相容性。即在完成给定的事件的几类方法中,每次只需要在其中选用一种。所以加法原理又叫分类法。
例7如果直角三角形的边长均小于10,且可以表示为:
m2+n2,m2-n2,2mn(m>n≥1,m,n∈N*),问有多少个这样的直角三角形?
算法分析
由已知得m2+n2<100,所以m≤9。
当m=2时,n=1;
当m=3时,n=1,2;
当m=4时,n=1,2,3;
当m=5时,n=1,2,3,4;
当m=6时,n=1,2,3,4,5;
当m=7时,n=1,2,3,4,5,6;
当m=8时,n=1,2,3,4,5;
当m=9时,n=1,2,3,4;
所以共有不同的满足条件的直角三角形种数为:1+2+3+4+5+6+5+4=30。
如果用程序来实现的话可以采用枚举法。
参考程序
var m,n,a,b,c,k:integer;
begin
for m:=2 to 9 do
for n:=1 to m do
begin
a:=m*m-n*n;
b:=2*m*n;
c:=m*m+n*n;
if (c<100) and (a>0) then begin
writeln(m,′ ′,n);
k:=k+1;
end;
end;
writeln(k);
end.
2.乘法原理
乘法原理:设完成某一件事,需要分n步,并且在第一步中有m1种方法;在第二步中有m2种方法;……;在第n步中有mn种方法。则完成这件事情共有N=m1×m2×…×mn种不同的方法。
乘法原理有下列特性:
①步骤间的相互依赖性。即每一步不能完成给定的事件,必须依次完成每一步,格可以完成整个事件。
②每一步里方法间的独立性。即在每一步的各种方法中,只需要在其中选用一种,就可完成这个步骤。所以乘法原理又叫分步法。
例8 用数字0,1,2,3能组成多少个三位数?
算法分析
第一步,确定百位上的数字,只能在1,2,3这三个数字中任取一个,有三种方法。
第二步,确定十位上的数字,可以在0,1,2,3这四个数字中任取一个,有四种方法。
第三步,确定个位上的数字,可以在0,1,2,3这四个数字中任取一个,有四种方法。
共有3×4×4=48种方法。
如果用程序来实现的话可以采用枚举法。
参考程序
var a,b,c:integer;
begin
for a:=1 to 3 do
for b:=0 to 3 do
for c:=0 to 3 do
begin
writeln(a,b,c);
k:=k+1;
end;
writeln(k);
end.
2.3.2排列
⑴定义
集合A中的一个排列就是A中元素的一个有序选出。如果两个排列满足下列条件之一,就被认为是不同的排列:
①所含元素不全相同;
②所含元素相同,但排列顺序不同。
⑵相异元素不重复的排列
定义:设从n个元素中,取出m个不同元素,按照一定顺序排成一列:当m<n时,叫作从n个不同元素中,取出m个不同元素的一种选排列;当m=n时,叫作n个不同的元素的全排列。
例如,从a,b,c,d四个元素中任取三个的所有排列。由乘法原理共有24种方法。
定理:从n个不的元素中,取出m个不同元素的选排列数记为,则
=n(n-1)…(n-m+1)。
n个不同的元素的全排列数记为,则=n(n-1)…3·2·1或=n!。
排列公式可以写成=。
例9 N的全排列的算法。
参考程序
const max=10;
type numb=1..max;
pera=array[0..max] of integer;
settype=set of numb;
var sele,num,count:integer;
total:settype;result:pera;
procedure nextone(total:settype;num:numb;sele:integer;var result:pera);
forward;{ 欲声明一个过程或函数,而且只给出它的名字和参数,不列出其实现代码,需要在句尾加forward 关键字}
procedrue permutate(total:settype;num:numb;sele:integer;var result:pera;var count:integer);
var i:integer;
begin
if sele=num then begin
for i:=0 to sele-1 do
write(result[i],′ ′);
count:=count+`1;
writeln;
end
else nextone(total,num,sele,result)
end;
procedure nextone(total:settype;num:numb;sele:integer;var result:pera);
;
var i:integer;
begin
for i:=1 to num do
if i in total then begin
result[sele]:=i
permutate(total-[i],num,sele+1,result)
end
end;
begin
write(‘input number(1-10):’);
read(num);
if (num>max) or (num<1)
then writeln(‘input error!’)
else begin
sele:=0;
count:=0;
total:=[1..num];
permutate(total,num,sele,result;count);
writeln(‘total order number:’,count);
end
end.
⑶其他类型的排列
①重复排列:从n个不同的元素中,可以重复地取出m个元素的排列叫作相异元素可重复选排列,其排列数为nm。
例10 从1,2,3,4,5五个数字中任取三个组成三位数,有多少个这样的三位数?
解 由于可以重复选择,则此排列数列数共有53=125个三位数。
②不全相异元素的全排列:如果在n个元素中,有n1个元素彼此相同,有n2个元素彼此相同,……,又有nm个元素彼此相同,并且n1+n2+…+nm=n,则这n个元素的全排列叫作不全相异元素的全排列,其排列数为:
如果n1+n2+…+nm=r<n,则这r个元素的选排列叫作不全相异元素的选排列,其排列数为
例11 把两个红球,一个篮球和一个白球放到10个编号不同的盒子中去,有多少种放法?
解 n=10,r =4,n1=2,n2=1,n3=1,方法总数为
③圆排列:n个不同元素不分首尾围成一个圆圈达到圆排列。其排列为:=(n-1)!
例12 有男女各5人,其中有3对是夫妻,沿圆桌就座,若每对夫妻都坐在相邻的位置,问有多少种坐法?
解 设3对夫妻分别为A和a,B和b,C和c,先让A,B,C三人和另外四人围圆桌就座的方法为7!/7种;又对上述坐法,a可以坐在A的左、右两侧,故有2种方法,b、c也一样。所以共有7!/7×2×2×2=5760种坐法.
2.3.3 组合
⑴定义
集合A中的一个组合就是A中元素的一个无序选出。
在某类集合中所有不同组合的个数叫做组合数。
⑵相异元素不重复的组合
定义:设从n个不同的元素中,取出m(m≤n)个不同元素,不考虑顺序并成一组,叫做从n个不同元素中,取出m个不同元素的一个组合。
例如从a,b,c,d四个元素中任选3个元素的所有组合是:abc,abd,acd,bcd。
定理:从n个不同的元素中,取出m个不同元素的组合数记作,则有===,规定=1。
例如,==56。
组合数的性质:定理=,=+。
例如:===4050。
⑶相异元素的重复组合
定义:设从n个不同的元素中,取出m(m≤n)个不同元素,若允许这m个元素可以重复使用,也允许m>n,则把这样的组合成为重复组合,其组合数记为:
=。
例13 把3个相同的球放到4个不同的盒子,有多少种方法?
解 这是允许重复组合的典型模型,用0表示球,用1划分出盒子。
例如
表示一种放法:第一个盒子有1个球,第二个
盒子没有球,第三个盒子有二个球,第四个盒子没有球。问题转化为:将n+1个1 和r个0排列,求使得每个排列两端都是1的放法总数。所以 ==20。
上述问题的一般化形式:把r个球放到n个编号不同的盒子,每个盒子里球的个数不限,放法总数是:。如果用表示第I个盒子里所放的球的个数,则++…+=r。
不同的放法对应了上述方程的不同的解。所求的放法种数就是该不定方程的所有非负整数解的组数。
2.3.4 常用计数原则
1.对应原则
如果存在集合S到易于计数的集合S1的一一对应,那么集合S1的元素个数,即‖S‖=‖S1‖。
应用对应原则求‖S‖,关键在于寻找一个既能于集合S建立一一对应关系,又便于计数的集合S1。因此,它实质上是一种转换法,把求‖S‖的问题转换为求‖S1‖的问题。
例14 有一个边长为为3 dm 的立方体,将其表面涂色。问:
① 至少要锯几次才能把它分成边长为1dm的小立方体?
② 所得到的小立方体有几个?
③ 所得到的小立方体中三面有颜色的有几个?
④ 所得到的小立方体中二面有颜色的有几个?
⑤ 所得到的小立方体中一面有颜色的有几个?
⑥ 所得到的小立方体中没有颜色的有几个?
解 如果将原立方体横、纵、竖各锯两次,可以锯成27个边长为1dm的小立方体。
原立方体中心的边长为1dm的小立方体有6个面与锯6次一一对应,所以至少要锯6次。所得到的小立方体有27个。
三面有色的小立方体有8个,因为只有从顶点处切下的小立方体的三面有色,而原立方体的顶点有8个。
两面有色的小立方体有12个,因为只有从棱中间切下的小立方体的两面有色,而原立方体的棱有12条。
一面有色的小立方体有6个,因为只有从各面中心切下的小立方体的一面有色,而原立方体的面有6个。
没有颜色的小立方体有1个,因为只有从原立方体中心切下的小立方体是没有颜色的。
2.抽屉原理
有些时候,不需要求出满足某些特定条件的对象一共有多少个,而是需要判断某些特定条件的对象是否存在。例如,有两个木箱,现在给你三个球,
让你把这三个球放到木箱里,你怎么放呢?一个木箱放两个球,另一个木箱放一个球,或者三个球都放在一个木箱里。不管怎样放,至少有一个箱 子里放着两个或两个以上的球。这里应用了一个很重要的原理——抽屉原理。
抽屉原理:如果把n+1件东西放入n个抽屉,则至少有一个抽屉里放着两件东西。例如,13个人一起走路,至少有两个人的生日在同一个月等。
3.容斥原理
设集合A是集合S的一个子集,Ā表示不属于A而属于S的集合,称为补集。用‖A‖表示集合A的元素个数,则‖A‖=‖S‖-‖Ā‖。
例如,求1到200之间能不能被23整除的整数个数?
解 ‖Ā‖=200/23=8,‖A‖=200-8=192。
上述原理可推广至一般性。
定理 设p1,p2是两个不同的性质,集合S中的任何一个元素可能具有这些性质之一或全部。令S的子集Ai元素具有性质pi(i=1,2)。 则A1∩A2就是S中的同时具有性质p1,p2的元素所组成的集合;Ā1∩Ā2 而就是S中的既不具有性质p1 ,又不具有性质p2 的元素所组成的子集。
所以:
‖Ā1 ∩Ā2‖=‖S‖-‖A1‖-‖A2‖+‖A1∩A2‖.