42节用穷举法设计程序.docx
- 文档编号:5948593
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:16
- 大小:102.79KB
42节用穷举法设计程序.docx
《42节用穷举法设计程序.docx》由会员分享,可在线阅读,更多相关《42节用穷举法设计程序.docx(16页珍藏版)》请在冰豆网上搜索。
42节用穷举法设计程序
一、 教学目标
1、 知识与技能
(1).认识程序调试的意义。
(2).基于计算机解决问题的调整,穷举法是计算机求解问题的基本算法。
(3).穷举法也是人们常用的解决问题的方法,计算机的出现大大提升了这种方法的意义。
(4).掌握用穷举法设计程序的基本思路。
(5).通过调试不同的例程,掌握穷举法穷举技巧(变量安排、穷举方案的确定)。
(6).计算机只是人类的工具,穷举方案的确定得靠人脑来完成,但穷举过程的实施计算机却比人脑有效。
(7).通过深入研究穷举的技巧,积累程序设计的经验,提升自己设计程序求解问题的能力。
(8).对于多种解决问题的方案,学会评价它们的好坏。
2、 方法与过程
本节以“百钱买百鸡问题”入手,由浅入深讲解了穷举算法的思路。
并通过钞票币值问题、电子邮箱密码问题的求解,介绍了如何恰当地安排穷举算法中的多个变量,如何设计穷举方案,使得穷举过程更加合理更有效率,举出了求一个5位密码问题的3种穷举方案,通过讨论、对比、总结,熟练掌握穷举算法的求解问题方法。
教学案例在最后部分安排了一个用于交流的问题,介绍了在穷举算法中,变量安排和穷举方案的确定是密切相关的如何安排,求解问题将会有许多方案,而不同的方案可能导致解决的效率有巨大的差异。
组织这些活动,在编程实践之后,对各种方案进行对比试验,加深穷举算法的理解。
3、 情感态度和价值观
通过本节内容的学习,学生对设计算法求解问题有了进一步的认识,对设计算法的步骤更加熟练,思考问题更加严密和有条理,程序编制和调试更有经验。
本节的学习对算法知识的积累,对继续学习的激发有更加强烈的愿望,培养学生的爱国主义精神。
二、 重点难点
1、 教学重点
(1)建立正确的数学模型,确定穷举方案。
(2)根据命题确定可解空间(即变量的取值范围)。
(3)正确表达“符合条件”的判断。
2、 教学难点
(1)如何确定穷举方案。
(2)如何评价各种穷举方案的优劣。
三、 教学环境
1、 教材处理
教材选自《广东省普通高中信息技术选修一:
算法与程序设计》第四章第二节,本节由一个植树数量的IQ题人手,引入穷举算法的思路。
并通过钞票币值问题、电子邮箱密码问题的求解,介绍了如何恰当地安排穷举算法中的多个变量,如何设计穷举方案,使得穷举过程更加合理更有效率,教材举出了求一个5位密码问题的3种穷举方案,希望通过讨论、对比、总结,熟练掌握穷举算法的求解问题方法。
教材在最后部分安排了一个用于交流的问题,介绍了在穷举算法中,变量安排和穷举方案的确定是密切相关的如何安排,求解问题将会有许多方案,而不同的方案可能导致解决的效率有巨大的差异。
组织这些活动,在编程实践之后,对各种方案进行对比试验,加深穷举算法的理解。
教材经处理后,以公元前5世纪,我国数学家张丘建在《算经》一书中提出了一个“百钱买百鸡问题”入手,由浅入深讲解了穷举算法的思路。
并通过钞票币值问题、电子邮箱密码问题的求解,介绍了如何恰当地安排穷举算法中的多个变量,如何设计穷举方案,使得穷举过程更加合理更有效率,教材举出了求一个5位密码问题的3种穷举方案,通过讨论、对比、总结,熟练掌握穷举算法的求解问题方法。
教学案例在最后部分安排了一个用于交流的问题,介绍了在穷举算法中,变量安排和穷举方案的确定是密切相关的如何安排,求解问题将会有许多方案,而不同的方案可能导致解决的效率有巨大的差异。
组织这些活动,在编程实践之后,对各种方案进行对比试验,加深穷举算法的理解。
教学方法是采用讲解、探究、任务驱动和学生自主学习相结合的学习方法。
2、 预备知识
学生已掌握了用计算机解决问题的过程,掌握了VB界面设计的相关内容,掌握了程序设计的基础,掌握了用解析法设计程序的方法。
3、 硬件要求
建议本节课在多媒体电脑教室中完成,最好有广播教学系统或投影仪,为拓展学习,学生机应允许上互联网。
4、 所需软件
学生机要安装VB6.0或以上版本。
5、 所需课时
2课时(90分钟)
四、 教学过程
导入:
问题1:
公元前5世纪,我国数学家张丘建在《算经》一书中提出了一个“百钱买百鸡问题”。
问题如下:
鸡翁一值钱5,鸡母一值钱3,鸡雏三值钱1。
百钱买百鸡,问鸡翁、鸡母和鸡雏各几何?
学生们利用所学的用解析法设计程序的方法很快就列出了解析式:
设公鸡数为x,母鸡数为y,小鸡数为z,则有方程:
X+y+z=100
5*x+3*y+z/3=100
学生产生议论,三个未知数,两个方程,如何求解?
老师引出穷举法的基本思想。
穷举法(枚举法)的基本思想是:
列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的全部解答。
即将x、y、z的各种可能的值代入方程,看是否满足两个方程,如果满足,就是一组解。
老师巡查发现同学们做出来的答案有两类错误。
第一类错误如下程序所示:
(可以得出正确的答案,但程序执行的效率较低,错误原因是没有排除不存在的情况,红色部分为出错所在)
PrivateSubCommand1_Click()
Dimx,y,zAsInteger
Forx=0To100
Fory=0To100
z=100-x-y
If5*x+3*y+1/3*z=100ThenPrintx,y,z
Nexty
Nextx
EndSub
运行结果:
图4-2
(1) 第一类错误程序运行的结果
第二类错误如下程序所示:
(得出的答案不完整,错误原因是:
没有考虑到公鸡、母鸡均有可能不买。
红色部分为出错所在)
PrivateSubCommand1_Click()
Dimx,y,zAsInteger
Forx=1To20
Fory=1To33
z=100-x-y
If5*x+3*y+1/3*z=100ThenPrintx,y,z
Nexty
Nextx
EndSub
运行结果:
图4-2
(2) 第二类错误程序运行的结果
4.2.1 用穷举法求解问题的基本过程
1.百钱买百鸡问题的求解
正确的算法:
(1) 分析问题
设公鸡数为x,母鸡数为y,小鸡数为z,则有方程:
X+y+z=100
5*x+3*y+z/3=100
根据题目意思可知:
0≤X≤100
0≤Y≤100
0≤Z≤100
根据题目意思上式可优化为:
0≤X≤100/5
0≤y≤100/3
(2) 设计算法
①X=0
②Y=0
③z=100-x–y
④判断5*x+3*y+1/3*z=100成立,则打印x,y,z
⑤如果y≤33,则y=y+1返回③
⑥如果x≤20,则x=x+1返回②
⑦结束
(3) 编写程序4-4(带下划线部分由学生完成)
PrivateSubCommand1_Click()
Dimx,y,zAsInteger
Print"公鸡","母鸡","小鸡"
Forx=0To20
Fory=0To33
z=100-x-y
If5*x+3*y+1/3*z=100ThenPrintx,y,z
Nexty
Nextx
EndSub
(4) 调试程序
图4-2(3) 正确程序运行的结果
(5) 检测结果
探究:
可不可以先对小鸡进行选择,如果可以程序代码如何改变,与程序4-4比较,哪个程序执行的次数多些,为什么?
4.2.2 用穷举法求解问题的基本过程
1.穷举法中变量的安排
问题2:
小张现有面值为1元、2元和5元的钞票(假设每种钞票的数量都足够多),如果小张想从这些钞票中取出30张用来换取小李的100元,问有小张有多少种取法?
输出每种取法中各种面额钞票的张数。
(1) 分析问题
本问题有3种面值的钞票,钞票的总张数是30张,应当如何穷举呢?
经分析可以知道:
当有两种面额的钞票数目确定了之后,可以从张数30确定第三种钞票的张数,然后由总面额是否100元而判断这个组合是否合乎要求。
(2) 设计算法
用ONE、TWO、FIVE分别表示1元,2元、5元钞票的张数。
变量ANSWER记录符合条件的解的数目、钞票的张数(用变量Pieces表示)和面额的总数(用变量Total表示)都通过输入框来输入。
穷举过程如下:
(老师详细分析)
① 让ANSWER=0,FIVE=0;
② TWO=0;
③ 让ONE=Pieces-TWO-FIVE
④ 检查5*FIVE+2*TWO+ONE是否等于Total,若是,则得到一组解,这时让ANSWER增加1。
并且输出解答;
⑤ 如果TWO<Pieces,那么让TWO增加1,返回步骤③;
⑥ 如果FIVE<Total/5,那么让FIVE增加1,返回步骤②;
⑦ 结束
如下图所示是钱币问题解决的流程框图
(3)编写程序(带下划线部分由学生完成)
根据算法写出程序4-5如下:
PrivateSubForm_Click()
Dimpieces,total,five,two,oneAsLong
pieces=Val(InputBox("钱币张数:
",,30)) '钞票张数的默认值为30
total=Val(InputBox("要求组成的总值:
",,100)) '总面值默认为100
Answer=0
Forfive=0Tototal/5
Fortwo=0Topieces-five
one=pieces-five-two
k=5*five+2*two+one
If k=total Then
Answer=Answer+1
Print"解决方案";Answer;":
"
PrintTab(10);"5元钞票";five;"张";
PrintTab(25);"2元钞票";two;"张";
PrintTab(40);"1元钞票";one;"张"
EndIf
Nexttwo,five
EndSub
(4)调试程序
图4-2(5) 输入钱币张数
图4-2(6) 输入钱币总值
图4-2(7) 程序4-5运行结果示意图
(5) 检测结果
复核知这个结果是符合题意的。
本节小结:
(1)用穷举算法解决问题,通常可以从两个方面进行分析:
① 确定范围;问题所涉及的情况有哪些,情况的种数可不可以确定。
② 验证条件:
分析出来的这些情况,需要满足什么条件,才成为问题的答案。
(3)要使用多重循环。
(4)如何评价一个算法的好坏,在考虑效率的同时,也要考虑程序的易读性。
交流:
如果首先进行最小面额的钞票的选择,程序代码该如何写?
与程序4-5比较,哪一个程序的判断比较的次数多些?
如何了解两个程序运行的具体次数?
本节第二课时:
2.穷举法中穷举方案的选择
问题3:
4-6:
陈婷有一个E-MAIL邮箱的密码是一个5位数。
但因为有一段比较长的日子没有打开这个邮箱了,陈婷把这个密码给忘了。
不过陈婷自己是8月1日出生,而她妈妈的生日则是9月1日,她特别喜欢把同时是81和91的倍数用作密码。
陈婷还记得这个密码的中间一位(百位数)是l。
你能设计一个程序帮她找回这个密码吗?
(1) 分析问题。
空中加油站:
(学生自己阅读)
用数学语言描述问题,叫做建立数学模型。
在解决实际问题时,一般都需要为这个问题建立数学模型。
本问题的数学模型是:
求出一个5位数,它的百位是1,而且它能同时被81和91整除。
交流
搜索的方式和范围是穷举算法所密切相关的两个方面。
那么,这个寻找密码的问题可以有哪些搜索方法呢?
请大家讨论一下,我们能够有哪些搜索方法。
(2) 设计算法A。
因为这个密码有4位数字是未知的,把各位数字都对所有可能性演变一次(最高位是1~9,其余各位都是0~9),就可以把可能的情况穷举完。
再把各位数字合成一个5位数,判断是否同时被81和91整除就可以了。
分别用a1、a2、a3、a4、a5表示这个5位数的各个数位(a3=1在程序中没出现),在它们各自的范围中变化,然后组成5位数d,判断d能否同时被81和91整除即可得到结果。
详细算法如下:
(老师详细讲解)
① a1=1
② a2=0
③ a4=0
④ a5=0
⑤ d=a1*10000+a2*1000+1*100+a4*10+a5
⑥ If(dMod81=0)And(dMod91=0)ThenPrintd
⑦ 如果a5≤9,则a5=a5+1返回⑤
⑧ 如果a4≤9,则a4=a4+1返回④
⑨ 如果a2≤9,则a2=a2+1返回③
⑩ 如果a1≤9,则a1=a1+1返回②
⑪ 结束
据此编写如下:
(学生完成带下划线部分)
PrivateSubcommand1_Click()
DimdAsLong
Fora1=1To9
Fora2=0To9
Fora4=0To9
Fora5=0To9
d=a1*10000+a2*1000+1*100+a4*10+a5
If(dMod81=0)And(dMod91=0)ThenPrintd
Nexta5,a4,a2,a1
EndSub
交流
程序4-6A可以改进吗?
(改进是以效率的高低而不是按程序的长短来衡量)
(2) 设计算法B。
空中加油站:
(学生自己阅读)
“\”:
整除运算符,即求出整数商。
表示要截取整数B的某些数位:
例如:
B\10:
表示截去B的个位。
B\100:
表示截去B的十位和个位。
B\1000:
表示截去B的百位、十位和个位。
① “mod”:
求余数运算符,即求出余数。
要保留整数的某些数位:
例如:
BMod10:
表示保留B的个位。
BMod100:
表示保留B的最后两位。
BMod1000:
表示保留B的最后三位
把方案A的方法反其道而行之。
5位数字的范围是10000~99999,在此范围内穷举,并对每一个数分解出它的百位数字检验它是否1,再判断此5位数是否同时被81和91整除就可以了。
设a是待求的5位数,b是百位上的数值。
① a1=10000
② b=a\100Mod10
③ Ifb=1AndaMod7371=0ThenPrint"这个位的密码是:
";a
④ 如果a1≤99999,则a1=a1+1返回②
⑤ 结束
(4) 编写程序。
(请同学们完成程序的设计,并评价这个方案。
)
PrivateSubCommand1_Click()
Fora=10000To99999
b=a\100Mod10
Ifb=1AndaMod7371=0ThenPrint"这个位的密码是:
";a
Nexta
EndSub
(5)设计算法C。
受方案B的启发,有解的范围只限于同时是81和91的倍数。
8l和91的最小公倍数是7371,所以我们只在5位数中就7371的倍数进行穷举,然后分离出它的百位数字判断是否是1就能得到答案。
按这个算法首先需要知道5位的7371的倍数中哪个最小。
亦即求最小的正整数P,使7371P≥1000,这时P≥10000÷7371。
显然,取10000÷7371的整数部分加1就是可用的P,即P=10000\7371+1
算法如下:
① p=10000\7371+1
② a=p*7371
③ c=a\100Mod10
④ Ifc=1ThenPrint"这个位的密码是:
";a
⑤ 如果a≤99999,则a=a+7371返回③
⑥ 结束
(6)编写程序(带下划线部分学生自己完成)。
PrivateSubCommand1_Click()
p=10000\7371+1
Fora=p*7371To99999Step7371
c=a\100Mod10
Ifc=1ThenPrint"这个位的密码是:
";a
Nexta
EndSub
(7)调试程序。
图4-2(8) 程序4-6A运行结果示意图
图4-2(9) 程序4-6B运行结果示意图
图4-2(10) 程序4-6C运行结果示意图
同学们通过在程序4-6A、B、C三个程序加入几条代码,比较一下,哪个程序的运算次数最少,效率最高?
穷举法小结:
(1)用穷举算法解决问题,通常可以从两个方面进行分析:
① 确定范围;问题所涉及的情况有哪些,情况的种数可不可以确定。
② 验证条件:
分析出来的这些情况,需要满足什么条件,才成为问题的答案。
(3)要使用多重循环。
(4)如何评价一个算法的好坏,在考虑效率的同时,也要考虑程序的易读性。
1)课外拓展
1、 相关资源
2)网络课程资料:
3)脑友网:
VB学习网站
4)学习VB的网络课件:
5)VB试题:
6)东莞中学信息技术网:
7)普通高中技术课程网:
2、 交流
问题只有一个变数时穷举是容易的,如果有两个变数就难些了。
变数越多就越困难,得好好安排穷举的顺序才行。
下面这个题目你打算怎样做呢?
如果一个正整数的立方能够分解为另外3个正整数的立方和,那么我们把这个正整数称为“好数”。
即若A、X、Y、Z都是正整数,且满足A3=X3+Y3+Z3,则称A为好数。
例如,6是最小的好数(63=33+43+53)。
请求出最小的10个好数。
(2)这节课文的几个程序都给出了问题的解答,但如果把已知的数据修改一下问题就可以没有解。
在问题没有解时这些程序就没有任何输出。
如何修改一下程序,使得在没有解的情况下输出“没有解”?
3、 课外练习
陈婷所在学校的3个环保活动小组经常利用节假日去栽树。
有一天,李老师问他们3个小组各栽了多少棵树?
因为李老师是教数学的,陈婷就调皮地回答:
“3个小组的栽树数量相乘的积是30723,您能把3个小组的栽树数量算出来吗?
”李老师说:
“只有这个条件不能确定答案呀。
你能补充点情况吗?
于是陈婷补充说:
“A组都是大个子同学组成的,栽的树虽然不到100棵,但比另外两组合起来的还要多。
栽树最少的c组也早就超过了10棵。
”这时李老师说:
“那我算出来了。
”李老师是怎样算出来的呢?
李老师后来告诉陈婷,她用的是穷举法。
参考答案:
书上P110页第1-5小题任意选择1题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 42节 用穷举法设计程序 42 穷举 设计 程序