书城科普读物探索未知-读故事谈数学
45047900000009

第9章 配对原理

“七国雌雄犹未分,攻城杀将何纷纷。”王维的这两句诗,可以概括战国时期诸侯之间连年不断的战争。在大大小小的战争中,有许多以弱胜强的战例。战国中期,齐魏两国的马陵之战就是其中之一。魏惠王26年(公元前344年),魏国派庞涓为大将,率大军进攻韩国。韩国向齐国求救。齐国派田忌为大将,孙膑为军师,率兵前往救援。孙膑再一次使用了“围魏救赵”的计策,不直接出兵韩国,却驱军直逼魏国的都城大梁(今河南开封)。魏惠王派太子申和庞涓为将,率十万大军回师迎战齐军。孙膑又用了一个“增兵减灶”的计策,在齐军进入魏国的第一天,在宿营地造了10万个灶,第二天减到5万个,第三天又减到3万个。庞涓一路追来,看到这种现象,心中暗喜。断定齐军入魏以后,部队严重减员,损耗过半。寻思必须乘势追击,于是丢下步兵,只带轻骑精锐兼程追赶,于当天傍晚追到马陵。马陵地势险要,道路狭窄,齐军早在此设下埋伏。庞涓遭到伏击,众寡悬殊,全军覆没。庞涓也因兵败计穷,自刎而死,齐军大获全胜,韩国之围自解。

也许我们会认为庞涓实在太愚蠢了,怎么能根据灶的减少来判断齐军人数的减少呢?其实,在正常的情况下,庞涓所用的方法是很正确的。在通讯技术很落后的古代,要了解敌军的情报是十分困难的。庞涓不可能直接去清点齐军的人数,但却可以通过计算齐军遗留下的灶数来估算出齐军的人数。例如,若一口灶大致供10人造饭,那么10万灶就约有军队100万人。庞涓的悲剧在于不知是计,因而酿成大错。

不过,历史的记载值得怀疑:孙膑第一天造了10万个灶,每口灶即使只供10人造饭,齐军也有100万之众,这是不可能的。如果不是史书的夸张而是当时的实情,庞涓早应该引起警惕,想到其中有诈,不宜轻易追击。退一万步说,即使齐军每天都严重减员,但最后既然还有3万灶,即使每灶只供5人造饭,也还有15万人,兵力远多于庞涓。《孙子兵法》云:“十则围之,五则攻之。”当自己的兵力10倍于敌时,才可以包围敌军;当自己的兵力5倍于敌时,才可以追击敌军。现在庞涓的兵力少于敌军,却冒进穷追,其败实在是必然的。庞涓身为大将,身经百战,且与孙膑同出名师门下,不应该不了解这一点吧!

如果不以成败论英雄的话,平心而论,庞涓通过计算齐军的灶数来估计齐军的人数,正是运用了数学中一个很重要的方法——配对原理,数学中在计算某一集合中元素的个数时,最常用、最有效的一个方法就是像庞涓那样,通过“映射”来间接计算。

如图29所示,设f是集合A到集合B的一个“一一对应”,则集合A与集合B的元素个数是相同的。如图30所示,f虽然不是A到B的一一对应,但A中每3个元素恰好对应B中一个元素,因而易知A中的元素个数是B中元素个数的3倍,这种映射称为倍数映射。

如果我们要直接计数集合A中元素的个数有困难时,但却可以找到另外一个集合B,A与B之间可以建立一一映射或倍数映射,并且B的元素个数容易计算,则可以转而计算B的元素个数。利用对应原理,特别是一一对应的原理,在日常生活中也是常见的。例如,我们常说的“一个钉子一个眼,一个萝卜一个坑”,就是一一对应的思想。假如一个农民地里的萝卜被人拔走了,他无法清点拔掉了多少萝卜,但只要数一数地里留下的萝卜坑就知道了。

下面,我们来看几个实际计算的例子:

(一)如图31所示,有8个城市呈环状排列,每两个城市之间都有一条公路相连,已知任何三条公路都不交汇于一处。现在要在每两条公路的交汇处建一座立交桥,需要建多少座立交桥。

用A,B,C,D,E,F,G,H8个点代表8座城市,得到一个八边形,这个八边形每两条对角线的交点要建立一座立交桥。

每一座立交桥都对应两条公路,每两条公路对应着4个城市。反过来也一样。例如,立交桥P对应两条公路BF和EH,而BF和EH这两条公路对应着4个城市B,E,F,H。

P→(BF,EH)→(B,E,F,H)

反过来,则有

(B,E,F,H)→(BF,EH)→P

由此可知,立交桥的集合A可与4城市组的集合B之间建立一一对应。因为8个城市每次取4个城市的组合数为C48=8×7×6×54×3×2×1=70所以一共要建70座立交桥。

(二)如图32所示,当我们取一个边长为3的正方体,将它横切两刀,纵切两刀,竖切两刀,可以切成27个边长为1的单位正方体。如果允许你把每次切出的小块任意叠起来切,你能否不用6刀(例如5刀或更少)就得出27个单位立方体呢?

你也许会动手试一试看,但结果肯定不会成功。为什么呢?问题的关键在于位于中心的那个小立方体。那个小立方体有6个面,不管你怎么切,每切一刀只能使它的一个面“曝光”。因此,切的刀数与中心那个立方体的面数之间可建立一种映射(一一对应)关系。所以,一定要用6刀才能切出27个单位立方体。

(三)有100名运动员参加乒乓球比赛,比赛采用淘汰制。将运动员两两分组进行比赛,败者被淘汰,胜者进入下一轮。如遇到运动员为单数,则令一个人轮空直接进入下一轮。最后决出冠军,问一共要进行多少场比赛!

这是一道很简单的数学题,小学生都会解答,但他们可能这样来计算:第一轮100人分成50组,赛50场;第二轮50人分成25组,赛25场;第三轮25人分成12组,一人轮空,赛12场;第四轮13人分成6组,一人轮空,赛6场;第五轮7人分成3组,一人轮空,赛3场;第六轮4人分成2组,赛2场第七轮剩下2人进行一场比赛决出冠军,因此,总的比赛场数是:50+25+12+6+3+2+1=99,这是一种不高明的算法,当参赛人数很多时,计算十分麻烦。特别是如果参赛人数是一般的n时,则无法按这个方法计算。

对这个问题可以有许多不同的算法。

体育部门实际安排比赛时,是按2的乘幂来进行的。如果一开始共有n=2m名运动员,则在每一轮比赛中都不会出现轮空,而且每一轮比赛的场数都是2的乘幂:第一轮2m-1场,第二轮2m-2场,……2场,1场。因此比赛的总场数是:2m-1+2m-2+…+22+2+1=2m-1=n-1,可见,当最初参赛人数为n=2m的特殊情况时,比赛场数为n-1.现在转到一般的情况,如果n不是2的乘幂,则n>2,必定有正整数m和r存在,使n=2m+r<2m+1,那么,只要在第一轮中安排r场比赛,其余的人都轮空。第一轮淘汰了r人后,剩下的2m人要进行2m-1场比赛,因此比赛的场数是2m-1+r=(2m+r)-1=n-1,另一种方法是利用数学归纳法。当参赛人数n=2,3,4时,由图33可知,分别要比赛1,2,3场。

因此,我们猜想对于n个人要比赛n-1场。

归纳假定k个人要赛k-1场,则有k+1个人时,在赛完第一场后,就只剩k人了,根据归纳假定,k个人要赛k-1场,所以k+1个人要赛k场。

根据数学归纳法原理,猜想是正确的。即有n个人参赛时,要赛n-1场。

类似地还可以用递推思想来解问题:假设n个人参赛时需要进行an场比赛。当比赛完第一场后,就剩下n-1个人,还需要再进行an-1场比赛。同样地,n-1个人赛一场之后,需要再进行an-2场比赛。因此有an=an-1+1=(an-2+1)+1=an-2+2=…

=a2+(n-2)

显然,只有两人参赛时a2=1。所以an=1+(n-2)=n-1。

最后,我们再看一种解法。因为每一场比赛都淘汰一名运动员,反之,每一名被淘汰的运动员都只在一场比赛中被淘汰。这就是说,比赛场次与被淘汰的运动员之间有一一对应的关系。如果最初有n名运动员参加比赛,因冠军只有1人,其余的n-1名运动员都被淘汰。所以,比赛恰好要进行n-1场。

最后一种解法不但无须作任何计算,而且具有更深刻、更本质的意义。它说明映射在计数中的重要作用。