(完整word版)穷举法
- 格式:doc
- 大小:30.01 KB
- 文档页数:2
基础算法(⼀)穷举法
基础算法(⼀)穷举法
穷举法的基本思想:从可能的解集合中⼀⼀穷举各元素,⽤题⽬给定的检验条件判定哪些是有⽤的,哪些是⽆⽤的,能使命题成⽴的,即为其解。
穷举法解题思路:
1、对命题建⽴正确的数学模型;
2、根据命题确定数学模型中各变量的变化范围(即可能解的范围);
3、利⽤循环语句、条件判断语句逐步求解或证明。
穷举法的特点:
算法简单,但运算量⼤。
对于可能确定解的范围,⼜⼀时找不到更好的算法时,可以采⽤穷举法。
例1、求满⾜表达式A+B=C的所有整数解,其中A、B、C为1~3之间的整数。
例2、鸡兔同笼问题(在同⼀个笼⼦⾥有鸡和兔⼦若⼲只,从上⾯看,能看到20个头,从下⾯看,能看到60只脚,问鸡兔各有多少只?)例3、百钱百鸡问题(⼀百块钱要买⼀百只鸡,这⼀百只鸡必须包含母鸡、公鸡和⼩鸡,其中,公鸡5元⼀只,母鸡3元⼀只,⼩鸡1元三只,
问有哪些购买⽅案?)
例4、⽔仙花数问题(ABC=A3+B3+C3,列出所有的整数ABC)
在⽤穷举法时,问题必须满⾜两个条件:
1、能够预先确定可能解的个数;
2、对每个解变量的取值,其变化范围也能预先确定。
使⽤穷举法时应注意的问题:
1、减少穷举变量;
2、缩⼩穷举变量的取值范围。
基本信息简介穷举法,或称为暴力破解法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。
例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试9999次就能找到正确的密码。
理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。
因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。
字符类型字符类型一般可以分为以下5种1.数字型0、1、2、3.4...9等(10个)2.大写字母A、B、C、D...Z等(26个)3.小写字母a、b、c、d...z等(26个)4.特殊字符~、$、#、@、&、()*等(33个)一般较少用5.用户自定义字符。
如果一个多位数并且有可能包含以上所有字符的密码的组合方法一定多的惊人,相对来讲破译的时间也会长的没法接受,有时可能会长达数年之久。
2破译方法概述穷举法是一种针对于密码的破译方法。
这种方法很像数学上的“完全归纳法”并在密码破译方面得到了广泛的应用。
简单来说就是将密码进行逐个推算直到找出真正的密码为止。
比如一个四位并且全部由数字组成其密码共有10000种组合,也就是说最多我们会尝试9999次才能找到真正的密码。
利用这种方法我们可以运用计算机来进行逐个推算,也就是说用我们破解任何一个密码也都只是一个时间问题。
当然如果破译一个有8位而且有可能拥有大小写字母、数字、以及符号的密码用普通的家用电脑可能会用掉几个月甚至更多的时间去计算,其组合方法可能有几千万亿种组合。
这样长的时间显然是不能接受的。
其解决办法就是运用字典,所谓“字典”就是给密码锁定某个范围,比如英文单词以及生日的数字组合等,所有的英文单词不过10万个左右这样可以大大缩小密码范围,很大程度上缩短了破译时间。
在一些领域,为了提高密码的破译效率而专门为其制造的超级计算机也不在少数,例如IBM为美国军方制造的“飓风”就是很有代表性的一个。
3对策现今稍具严密度的密码验证机制都会设下试误的可容许次数以应对使用密码穷举法的破解者。
用穷举法求解的基本过程穷举法又称试探法,是求解复杂问题常用的一种算法。
它被用来求解实际生活中各种数学、物理、化学、经济和社会等问题,它具有良好的实用价值。
穷举法是求解复杂问题的一种有效方法。
一、基本步骤(1)明确问题。
明晰问题,确定问题的求解内容,定义解空间。
(2)构建搜索树。
将解空间的每一个可能情况看作一个结点,绘制搜索树,综合运算问题的知识,将搜索空间分拆成若干小搜索空间,由此得出结点关系。
(3)生成搜索策略。
根据问题特点及给定的条件来确定搜索策略,选择最有效的搜索方式进行搜索,此步骤将决定整个穷举法求解问题的有效性。
(4)开始搜索。
依据构建的搜索树和确定的搜索策略开始搜索,首先检测第一个结点,根据条件检测的结果如果不满足就进行下一个结点的检测,直至找到最终的结果,搜索停止。
(5)结果验证。
检查搜索结果,验证是否符合原问题的要求,确保问题得到正确的求解结果。
二、优缺点(1)算法在求解复杂问题上有良好的实用价值,能够较好地把问题分解为若干小问题。
(2)搜索空间确定时,受限于其解空间的大小,穷举法在处理解空间较大的问题时存在搜索时间长的问题。
(3)穷举法在求解给定问题时,必须要进行大量的计算,计算量较大,影响了算法的效率。
(4)穷举法也缺乏一定的针对性,如果解空间较大,则需要花费更多的时间来完成。
穷举法是求解复杂问题的一种有效的方法,它具有良好的实用价值,综合运用数学、物理、化学、经济和社会等问题,可以有效地搜索出最优解。
但是,该算法也存在搜索时间过长、计算量大、缺乏针对性等弊病,该如何改进才能更好地提高求解复杂问题的效率,因此,对穷举法还有很大的改进空间,需要不断探索新的方法去改进穷举法,从而使它更好地服务于实践生活。
拓展知识5-1 穷举法一、什么是穷举法在实际问题中,经常遇到在一定范围内寻求某类事物解的问题。
比如:求水仙花数,因为水仙花数是一个三位数,所以,[100,999]就是给定的范围,水仙花数就是要求的解;又如:百马百担问题,求解决方案,大马数量[1,33],中马数量[1,50],小马数量[1,100] 就是给定的范围,解决方案就是要求的解等。
像这类问题,可以通过对指定范围内每种可能的情况进行一一测试,验证其是否是满足条件的解的方法来解决,我们就把这种解决问题的方法称为穷举法。
由于实际问题的指定范围可能很大,所以,穷举法更适合于使用计算机,因此,这类问题可通过程序设计来解决。
二、穷举法解决问题的关键1.确定范围(1)往往实际问题给定的范围不一定很明确,需要我们通过分析来确定范围;(2)所得到的范围还可以利用给定的部分约束条件进一步缩小,以减少程序的运行时间,提高效率。
2.确定解的条件通过对实际问题进行分析,给出判断解的条件,有了判断解的条件才能对每种可能的情况进行一一验证,从而得到问题的解。
三、穷举法解决问题的步骤1.分析问题,确定范围变量,给出解的判断条件;2.用循环或循环的嵌套对范围变量的所有可能情况进行一一测试;3.用选择语句判断每种情况是否符合解的条件;4.输出符合条件的情况。
四、穷举法的优化策略1.减少范围变量范围变量能少用尽量少用,这样可大大减少测试的数量。
例如百马百担问题,对大马、中马、小马均可设一个范围变量dm、zm、xm,其范围分别是:[1,33],[1,50],[1,100],总的测试数量为33*50*100=165000次;在大马、中马具体确定后,小马可利用约束条件dm+zm+xm=100来确定,因此,只需将大马、中马设为范围变量,这样测试数量为33*50=1650次。
可见,减少范围变量的使用可大大减少测试的数量。
2.缩小穷举范围根据实际问题的隐含条件,可将不符合条件的情况去掉,缩小穷举范围,减少穷举变量的值域。
穷举法、贪心法、分枝限界法讲解人:一、穷举法(枚举法)(一)算法思路就是从可能的解的集合中一一枚举各元素,用题目给定的检验条件,判定哪些是无用的,哪些是有用的。
能使命题成立,即为其解。
(二)例子(第二章介绍过的货郎担问题)假定以编号为1的城市为始发城市,那么就会有4!=24个不同的路线,我们只要列举出每一条路线并分别计算出相应的费用即可。
从中就可以找出最小费用及对应的路线。
(三)算法复杂度:O(n!)(四)算法评价优点:可得到精确值。
当n较小时,是可行的;缺点:较笨拙,由于须列举所有情况,且记录下每次的情况,需要大量的机时和内存空间。
当n较大时,该算法是不可行性的。
二、贪心法贪心法是一种对某些求最优解问题的更简单、更迅速的设计方法。
(一)引言在给出贪心法的具体定义和算法步骤之前,我们先来看两个例子。
例1 假设有4种硬币,它们的面值分别为1角、5分、2分和1分。
现要找给某顾客3角7分钱,这时,我们几乎不假思索地拿出3个l角、1个5分和1个2分的硬币交给顾客。
我们不仅能很快决定要拿哪些硬币,而且与其它找法相比.我们拿出的硬币的个数肯定是最少的。
在这里,我们实际使用了这样的算法:首先选出一个面值不超过3角7分的最大硬币(1角),然后从3角7分中减去1角,剩下2角7分再选出一个不超过2角7分的最大硬币(另一个1角),如此做下去,直到找足3角7分。
例2 如图1—1,其中,顶点可解释为城市,边上的代价可解释为两城市问的里程。
在图中找一条经过所有结点一次的回路,并使里程的总和为最小。
这同样还是货郎担问题。
在解此题时,我们可以按这样一个想法去做:首先在图中选一条代价最小的边。
为了选择下一条边,先要检查一下候选边与已选入的边之间是否满足以下两点:1)不会有三条边(候选边及已入选边)与同一顶点相关联。
2)不会使入选边形成回路,除非入选边的个数已等于图中的顶点总数。
在满足以上两点的候选边中,挑选最短的边作为入选边。
如此做下去,直到得到一个经过所有顶点的回路。
第三讲穷举法一、穷举法的基本概念穷举方法是基于计算机特点而进行解题的思维方法。
一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。
这样解决问题的方法我们称之为穷举算法。
穷举算法特点是算法简单,但运行时所花费的时间量大。
有些问题所列举出来的情况数目会大得惊人,就是用高速的电子计算机运行,其等待运行结果的时间也将使人无法忍受。
因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。
二、穷举算法模式穷举算法模式:(1)问题解的可能搜索的范围:用循环或循环嵌套结构实现(2)写出符合问题解的条件。
(3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。
三、使用穷举法设计算法穷举法应用很多,比如一些密码破译软件通常就是用的穷举算法。
如在QQ上,OicqPassOver这个工具穷举你的口令,它根据机器性能最高可以每秒测试20000个口令,如果口令简单,一分钟内,密码就会遭到破译。
下面我们来以三个例子说明穷举法的具体应用。
实例一:古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。
分析:(1)本题是一个搜索问题,搜索范围 2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数据的本身。
(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和。
程序如下:Program p3_1 ;Var a , b,s :integer ;BeginFor a:=2 to 1000 doBeginS:=0 ;For b:=1 to a -1 doIf a mod b =0 then s:=s+b ; { 分解因子并求和 }If a=s then beginWrite( a, ‘=’ ,1, );For b:=2 to a -1 doIf a mod b=0 then write( ’+’, b );Writeln ;End;End;End.当程序运行后,输出结果:6 = 1 + 2 + 328 = 1 + 2 + 4 + 7 + 14496 =1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248实例二:(第七届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题)在A,B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。
第16章 穷举算法与实验穷举方法是基于计算机特点而进行解题的思维方法。
一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。
这样解决问题的方法我们称之为穷举算法。
穷举算法特点是算法简单,但运行时所花费的时间量大。
因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。
虽然穷举法效率并不高,但是适应一些没有明显规律可循的问题的解决。
因为穷举算法就是从所有可能的情况中搜索正确的答案,所以一般可按如下步骤: 第1步: 对于一种可能的情况,列举出来并计算其结果;第2步:判断结果是否满足要求,如果不满足则执行第1步来搜索下一个可能的情况,如果满足要求,则表示寻找到一个正确的答案,执行下一步操作,如寻找其他正确(合适)的答案或者中断循环。
16.1三角形数问题16.1.1 问题描述将 ,F ,E ,D ,C ,B ,A 这六个变量排成如图所示的三角形,这六个变量分别取[1,6]上的整数,且均不相同。
求使三角形三条边上的变量之和相等的全部解。
如图就是一个解。
A 6B C 3 1D F 2 4E 516.1.2 问题分析程序引入变量123456,,,,,i i i i i i ,代表,F ,E ,D ,C ,B ,A 并让它们分别顺序取1至6的正整数,在它们互不相同的前提条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。
当这些变量取尽所有的组合后,程序就可得到全部可能的解。
细节见下面的程序。
【程序1】%穷举法解三角形数 for i1=1:6 for i2=1:6 if i1==i2 continue;endfor i3=1:6if i1==i3 || i2==i3continue;endfor i4=1:6if i1==i4 || i2==i4 || i3==i4continue;endfor i5=1:6if i1==i5 || i2==i5 || i3==i5 || i4==i5continue;endfor i6=1:6if i1==i6 || i2==i6 || i3==i6 || i4==i6 || i5==i6continue;endif i1+i2+i4==i1+i3+i6 && i1+i2+i4==i4+i5+i6fprintf ('%6d\n',i1) ;fprintf ('%4d%4d\n',i2,i3) ;fprintf ('%2d%4d%4d\n\n',i4,i5,i6) ;endendendendendendEnd16.1.3 问题讨论按穷举法编写的程序通常不能适应变化的情况。
穷举算法一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的规律或公式)时,可以根据问题的部分条件将所有可能的情况列举出来,然后通过一 个一个验证是否符合整个问题的求解要求,而得到问题的解。
穷举算法简单,但往往运行时所花费的时间很长(因为要列举出所有情况)有些问题所列出的情况数目大的惊人,尽管计算机速度非常快,但是等待运行结果的时间仍然让人无法接受(有些问题用穷举法解可能要几年甚至更多时间),另外列举出来的众多的情况如何在计算机中存储也是个问题,因此穷举法一般用在无规律的问题求解中,并且要尽可能地将明显不符合条件的情况排除在外,以节省时间。
1、圆盘找数,如图所示,找出4个相邻的数,使其相加之和最大和最小的是哪4个数,并2、将A,B,C,D,E,F 这6个变量排成如图的三角形,这6个变量分别取[1,6]上的整数,且均不相同,求使三角形三条边上的变量之和相等的全部解。
(其中一个解)3、【问题】甲乙丙丁戊五个人在运动会上分获百米、二百米、跳高、跳远和铅球冠军,有四个人猜测比赛结果:A说:乙获铅球冠军,丁获跳高冠军。
B说:甲获百米冠军,戊获跳远冠军。
C说:丙获跳远冠军,丁获二百米冠军。
D说:乙获跳高冠军,戊获铅球冠军。
其中每个人都只说对一句,说错一句。
求五人各获哪项冠军。
【算法】用1,2,3,4,5分别代表百米、二百米、跳高、跳远和铅球5个项目,用a,b,c,d,e 分别代表五人。
如b=3 表示乙获跳高冠军。
用多重循环穷举出来。
4、古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1,2,4,7,14,且1+2+4+7+14=28,则28是一个完全数,编程求2~1000内的所有完全数。
A B C D E F 16 3 2 5 45、一根29cm长的尺子,只允许在上面刻7个刻度,要能用它量出1~29cm的各种长度,试问这根尺的刻度应该怎样选择?6、邮局发行一套票面有四种不同值的邮票,如果每封信所贴邮票张数不超过三枚,存在整数r ,使得用不超过三枚的邮票,可以贴出连续的整数1,2,3,………r 来,找出这四种面值数,使得r 值最大。
搜索方法——穷举算法穷举法,常常称之为枚举法,是指从可能的集合中一一穷举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。
能使命题成立者,即为问题的解。
穷举是最简单,最基础,也是通常被认为非常没效率的算法,但是。
穷举拥有很多优点,它在算法中占有一席之地。
首先,穷举具有准确性,只要时间足够,正确的穷举得出的结论是绝对正确的;其次,穷举拥有全面性,因为它是对所有方案的全面搜索,所以,它能够得出所有的解。
采用穷举算法解题的基本思路:(1)确定穷举对象、穷举范围和判定条件;(2)一一列举可能的解,验证是否是问题的解例题:谁是小偷Description警察抓住A B C D四名罪犯,其中一人是小偷。
审问A 说:"我不是小偷"。
B说"C是小偷"。
C说"小偷肯定是D"。
D说"C在冤枉人"。
现在已经知道四个人中三人说的是真话,一个人说假话,问小偷到底是谁?Sample OutputC代码如下:Var a,b,c,d:integer;beginfor a:=0 to 1 do beginfor b:=0 to 1 do beginfor c:=0 to 1 do beginfor d:=0 to 1 do beginif a+b+c+d=1 then beginif ord(a=0)+ord(c=1)+ord(d=1)+ord(d<>1)=3 then begin if a=1 then writeln('A');if b=1 then writeln('B');if c=1 then writeln('C');if d=1 then writeln('D');end;end;end;end;end;end;end.再看一眼条件:审问A说:"我不是小偷"。
特殊解题方法——穷举法解答某些数学题,可以把问题所涉及到的数量或结论的有限种情况,不重复不遗漏地全部列举出来,以达到解决问题的目的。
这种解题方法就是穷举法。
例1 从甲地到乙地有A、B、C三条路线,从乙地到丙地有D、E、F、G四条路线。
问从甲地经过乙地到达丙地共有多少条路线?(如图3.28)分析:从甲地到乙地有3条路线,从乙地到丙地有4条路线。
从甲地经过乙地到达丙地共有下列不同的路线。
解:3×4=12答:共有12条路线。
例2 如果一整数,与1、2、3这三个数,通过加减乘除运算(可以添加括号)组成算式,能使结果等于24,那么这个整数就称为可用的。
在4、5、6、7、8、9、10、11、12这九个数中,可用的有_______个。
(1992年小学数学奥林匹克初赛试题)分析:根据题意,用列式计算的方法,把各算式都列举出来。
4×(1+2+3)=24 (5+1+2)×3=246×(3+2-l)=24 7×3十豆十2—248×3×(2-1)=24 9×3—1—2—2410×2+l+3=24 11×2+3-l=2412×(3+1-2)=24通过计算可知,题中所给的9个数与1、2、3都能够组成结果是24的算式。
答:可用的数有9个。
例3 从0、3、5、7中选出三个数字能排成_______个三位数,其中能被5整除的三位数有_________个。
(1993年全国小学数学竞赛预赛试题)分析:根据题中所给的数字可知:三位数的百位数只能有三种选择:十位数在余下的三个数字中取一个数字,也有3种选择;个位数在余下的两个数字中取一个数字,有2种选择。
解:把能排成的三位数穷举如下,数下标有横线的是能被5整除的。
305,307,350,357,370,375;503,507,530,537,570,573;703,705,730,735,750,753答:能排成18个三位数,其中能被5整除的有10个数。
穷举算法穷举,又叫枚举法,指的是从可能的解的集合中一一枚举各元素,用题目给定的检验条件判定哪些是能使命题成立,即为其解。
应用到程序中,枚举有许多表现形式,比如把所有的组合都扫描一遍,找出符合要求的组合。
举个简单的例子,找素数。
1什么都不是,2是素数,3是,4不是,5是……,如此把所有的自然数(当然是不可能的,只能尽量多)都找一遍,就能找出所有的素数。
可以这么说,枚举是最简单,最基础,也是最没效率的算法,但是。
枚举拥有很多优点,以致于他能够活到现在而不被淘汰。
首先,枚举有超级无敌准确性,只要时间足够,正确的枚举得出的结论是绝对正确的。
其次,枚举拥有天下第一全面性,因为它是对所有方案的全面搜索,所以,它能够得出所有的解。
例:找偶数。
【题目一】把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法?【答案】461种提示:for i:=1 to 93 dofor j:=1 to 47 dofor k:=1 to 19 doif 100=i+2*j+5*k then n:=n+1;还有没有效率更高的算法呢?留给大家考虑。
【题目二】将1,2...9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数.分析:这是1998年全国分区联赛普及组试题(简称NOIP1998pj,以下同)。
此题数据规模不大,可以进行枚举,如果我们不加思地以每一个数位为枚举对象,一位一位地去枚举:for a:=1 to 9 dofor b:=1 to 9 do………for i:=1 to 9 do这样下去,枚举次数就有99次,如果我们分别设三个数为x,2x,3x,以x为枚举对象,穷举的范围就减少为93,在细节上再进一步优化,枚举范围就更少了。
【题目三】:穷举法中穷举方案的选择:陈婷有一个E-MAIL邮箱的密码是一个5位数。
但因为有一段比较长的日子没有打开这个邮箱了,陈婷把这个密码给忘了。
用穷举法解决问题教学设计
【教材分析】
本节课选自教科版《算法与程序设计》选修第三章的第二节。
本节课讲的是现实生活中解决问题的一种算法——穷举法,实际上是使用for-next循环语句来解决实际问题。
本节要求学生初步了解穷举算法的思想,总结出穷举法解决问题的一般步骤,总结出哪一类的、具有什么特征的问题适合用穷举法来解决。
本课内容是对算法学习的引入,为高中阶段算法的学习打下了基础。
【学情分析】
本节内容的教学对象是高二年级学生,他们已经具备了一定的逻辑思维、分析问题、表达思想等能力。
同时,通过前两个章节的学习与实践,学生已经历了用计算机解决问题的过程与步骤,学会了对计算机程序进行调试,并掌握了顺序、选择、循环三种程序结构,为本节内容的学习提供了良好的基础。
前一节的学习,学生掌握了如何用解析法解决问题,但现实生活中也有很多问题往往无法用解析法找到答案,这时候我们可以尝试采用另外一种方法“穷举法”,从而引出本课内容。
因此对此类问题的归纳求解,学生应该掌握。
【教学目标】
知识与技能:
1、巩固for…next循环语句的格式和运用。
2、了解什么是穷举法以及用穷举法解决问题的一般步骤。
3、了解穷举法具有一定的适用范围。
4、能够根据具体问题的要求,使用穷举法设计算法。
过程与方法:
本节以“百钱买百鸡问题”入手,由浅入深讲解了穷举算法的思路。
通过讨论、对比、总结,熟练掌握穷举算法求解问题的方法。
在编程实践之后,对各种方案进行对比试验,加深穷举算法的理解。
情感态度与价值观:
了解算法和程序设计在计算机解决问题过程中的重要性;体验将算法转变为程序的过程,享受计算机解决问题的快乐;培养学生发现、探索和创新的能力。
【教学重、难点】
重点:用穷举法解决问题的一般步骤;能根据具体问题的要求,提高运用穷举法解决问题的能力。
难点:哪一类问题适合穷举法,确定穷举的范围以及评价穷举效率的高低。
【教学方法】
本节内容理论性和实践性都比较强,所以用演示、实践、讨论、任务驱动等多种形式的教学活动让枯燥的内容和生动有趣的任务结合起来。
【教学课时】
1课时
【教学环境】
硬件:机房一间,多媒体教学系统一套
软件:Visual Basic软件、自制的课件
【教学过程】
一、导入
上节课我们学习用解析法解决问题,用解析法解决问题的过程是:分析问题→抽取数学模型→导出解析表达式→设计算法→编写代码→调试运行程序。
用解析法解决问题具有高效、快捷的特点,但是解析法也有“束手无策”的时候,有些问题即使可以用解析法,但求解过程和
步骤也很复杂。
这个时候,我们可以尝试采用另外一种方法,就是我们今天要给大家介绍的穷举法。
二、新授
(一)什么是穷举法
教师活动:穷举法我们不难理解,它是将求解对象一一列举出来,然后逐一加以分析、处理,并验证结果是否满足给定的条件,穷举完所有对象,问题将最终得以解决。
那我们说生活中你遇到过穷举法解决问题吗?
学生活动:遇到过。
教师活动:比如说?
学生活动:密码记不起来的时候,我们要一个一个去试;要开门却不知道是哪把钥匙我们也只能一把一把去试;警察办案的时候将犯罪嫌疑人一一列举出,然后逐个排查,最终确定罪犯是谁。
(二)用穷举法解决问题的一般步骤
接下来我们用穷举法解决一个问题——“百钱买百鸡”问题:公元前5世纪,我国数学家张丘建在《算经》一书中提出了一个“百钱买百鸡问题”。
问题如下:鸡翁一值钱5,鸡母一值钱3,鸡雏三值钱1。
百钱买百鸡,问鸡翁、鸡母和鸡雏各几何?
那么对于此题,用现代文是这样描述的:一只公鸡值五文钱,一只母鸡值三文钱,三只小鸡值一文钱,问一百文钱买一百只鸡,可以买多少只公鸡、母鸡和小鸡。
当然这个题它还有一个隐性条件就是说你买回来的公鸡、母鸡和小鸡必须是一个整数。
1.分析问题
我们计算一下,假设公鸡数为x,母鸡数为y,小鸡数为z,可列出方程:
大家发现问题了没有?三个未知数,两个方程,没有办法求解。
我们只能一一去试,具体到本题就是将x、y、z的各种可能的值代入方程,看是否满足两个方程,如果满足,就是一组解。
2.确定穷举对象的范围那我们来看看x的值可能有哪些。
根据题目的意思可知0≤x≤20。
母鸡呢?0≤y≤33.小鸡呢?0≤z≤100。
虽然确定了x、y和z的范围,但我们不可能毫无规律的随便取一个x、y、z的值进行尝试,一般总是按照一定规律来取值的,过程如右图。
3.验证条件、编程实现我们每取一组解都要判断它们是否满足这两个方程。
那么我们看一下,对于这一部分我们用什么语句来实现?循环语句。
几层循环?三层循
环。
最外层循环控制x的值,第二层循环控制y的值,第三层循环控制z的值。
好我们写出来。
For x=0到20配next x,For y=0到33配next y,For z=0到100配next z。
那这一部分呢?用什么语句?判断语句。
怎么写?if x+y+z=100 5*x+3*y+z/3=100,这两个条件要同时满足用什么连接?用and连接。
满足这两个条件就输出x、y、z的值,然后end if结束。
好下面我启动VB录入代码来解决这个问题,在我录入的过程中大家去思考这样一个问题:循环执行的次数是多少?能不能再少一些?也就是程序可不可以优化?
教师活动:问题解决了,那么现在请你思考我刚才提出的问题。
学生回答:循环执行72114次。
可以再少一些。
当母鸡和公鸡确定了的时候,小鸡就不用再穷举了,直接用z=100-x-y表示。
教师活动:你能不能用优化的思想改写这个程序?
学生活动:上台修改程序。
修改后的代码如下:
dim x as integer
dim y as integer。