师:同学们,大家好。在上新课之前,我们先来看一段憨豆先生的视频。观看过程中,请大家仔细观察憨豆先生在剧中碰到了什么问题,他又是如何解决的。
(播放视频)
师:从剧中我们发现,憨豆先生碰到的问题是电话号码的最后两位被手指挡住了。剧中,憨豆先生灵机一动,想到的解决思路是:第一步,列举出电话号码后两位所有可能的情况;第二步,按顺序逐个拨打前面几位数字加列出的所有情况组成的电话号码,直到拨通小男孩爸爸的电话为止。
憨豆先生确定小男孩爸爸电话号码的方法,就是人们常说的列举所有可能的情况,一个一个地试,看看哪个号码正确。我们称憨豆先生使用的方法为穷举法。请同学们想一想,穷举法在生活中还有哪些应用呢?老师列举了穷举法在生活中的一些应用,比如文件忘记放在哪个柜子里了,可以挨个柜子去找;一串钥匙中忘记哪把能开锁时,可以逐一试用每一把钥匙;忘记密码锁的密码时,可以一个一个去试等等。
因为使用穷举法解决问题时,需要一一列举出所有可能的情况,当列举范围较大时,人工穷举费时费力,很难完成。有没有更好的解决方法呢?这时我们可以借助计算机运算速度快的优势,通过编程求解,提高解决问题的效率。今天我们就来学习广东教育出版社高中信息技术选修一《算法与程序设计》的第四章第二节内容——用穷举法设计程序。
我们先来了解一下穷举法的基本思路。穷举法的基本思路是在求解过程中,按照一定顺序,一一列举出求解对象所有可能的情况,然后逐一分析判断哪些满足问题要求的条件,穷举完所有可能情况,从而得到问题的解答。在穷举法中,我们称求解对象为穷举对象,列举出的所有可能情况是穷举范围,这里的问题要求的条件指判断筛选答案时所需要的判断条件。其实对憨豆先生来说,只要拨通小男孩爸爸的电话号码,后面的电话号码就不用再一一验证了。但是对于一些多解的问题,就需要穷举完所有可能的情况,否则会产生漏解的情况。
那么哪些问题适合用穷举法解决呢?因为穷举法要一一列举出所有可能的情况,所以用穷举法解决的问题,其解的范围须是明确的、有限的,否则无法完成穷举操作。除了前面提到的穷举法在生活中的一些应用,还有一些推理题,如丢番图的年龄、谁是凶手、百钱买百鸡问题等,也可以用穷举法来解决。接下来我们就用穷举法编程求解百钱买百鸡问题,请跟着老师一起读一下题目。
师:公鸡5文钱一只,母鸡3文钱一只,小鸡一文钱三只。用100文钱买100只鸡,问公鸡、母鸡、小鸡各买多少只?要求三种鸡都要买,也就是说答案中不能有0只的情况。
我们知道编程解决问题的一般过程是分析问题、设计算法、编写程序和运行调试。首先我们来分析已知条件、求解目标和它们之间的关系。已知条件是公鸡5文钱一只,母鸡3文钱一只,小鸡一文钱3只。求解目标是公鸡、母鸡、小鸡各买多少只?已知条件与目标之间的关系是,用100文钱买100只鸡,每种鸡都要有。通过上节课的学习,我们知道用解析法解决问题具有高效快捷的特点。在本案例中,通过已知条件与目标之间的关系,我们假设公鸡、母鸡、小鸡各买x、y和z只,会得到这样两个方程,即公鸡只数加母鸡只数加小鸡只数等于100,买公鸡花的钱加买母鸡花的钱加买小鸡花的钱也等于100。根据数学经验,有三个未知数,两个方程无法推导出所需的解析表达式。显然百钱买百鸡问题无法用解析法求解。但是我们知道公鸡、母鸡和小鸡,它们的只数一定在100只以内,所以它们解的范围又是明确的、有限的。我们不妨用憨豆先生用过的方法——穷举法,把所有可能的解穷举出来,一个一个地判断。
根据穷举法的基本思路,首先要确定穷举对象的穷举范围和判断问题成立的条件,然后再编写程序进行穷举。假设穷举对象为公鸡、母鸡和小鸡。由于公鸡5文钱一只,100文钱最多只能买20只,考虑到三种鸡都要有,所以公鸡的穷举范围是1 - 20。同理,由于母鸡3文钱一只,100文钱最多只能买33只,所以母鸡的穷举范围是1 - 33。小鸡一文钱3只,最多只能买99只,又因为钱数必须是整数,所以要买的小鸡数需是3的倍数,所以小鸡数从3开始穷举,每次加3直到99。判断条件就是鸡的总数等于100,所花的钱也是100。
下面我们来设计算法,对于百钱买百鸡问题,编程时如何穷举出所有可能的解,在程序中又要用到哪些基本结构呢?通过刚才的分析,我们知道百钱买百鸡问题各穷举范围有明确的起点和终点,可以使用循环结构实现穷举,按顺序逐一列举出所有可能的解。在利用条件筛选判断解的过程中,可以用分支结构来实现。现在我们一起来规划一下流程图。
根据前面的分析,我们需要三个变量,x、y和z分别表示要买的公鸡数、母鸡数和小鸡数。根据排列组合的知识,要穷举完三种鸡所有的组合,需要用三重循环嵌套结构。我们假定最外层循环穷举的是公鸡数,第二层循环穷举的是母鸡数,最内层循环穷举的是小鸡数。
程序开始运行,公鸡数x先赋值为1,母鸡数y也赋值为1,小鸡数z先赋值为3。接下来执行判断语句,判断此时x、y、z的值能否使得条件表达式成立。如果成立,输出此时x、y、z的值。接下来不管判断条件是否成立,小鸡数z的值都加3,继续重复刚才的判断和小鸡数加3,如此循环,直到z的值大于99,跳出最内层循环。至此,穷举出了一只公鸡、一只母鸡和3 - 99只小鸡所有的情况。接下来母鸡数加1变成2,继续刚才的最内层循环。然后每一次内层循环结束之后,母鸡数都加1,直到母鸡数为33,至此穷举出了一只公鸡、1 - 33只母鸡和3 - 99只小鸡的所有组合情况。接下来跳出第二层循环,公鸡数加1变成两只,重复刚才的第二层和最内层循环,然后每一次跳出第二层循环,公鸡数都加1,一直到公鸡数为20,结束程序。至此,穷举出了1 - 20只公鸡、1 - 33只母鸡和3 - 99只小鸡的所有组合情况。
