高中信息技术算法与程序设计分册4.2穷举法教案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.2穷举法

[授课形式]

讲授课、实践课

[教学目标]

1、理解穷举法是计算机求解问题的基本算法。

2、掌握穷举法设计程序的基本思路。

3、通过调试不同的程序,掌握穷举法穷举技巧。

4、对于多种解决问题的方案,学会评价它们的好坏。

[教学重点]

1、建立正确的数学模型,确定穷举方案。

2、根据命题确定即变量的取值范围。

3、正确表达“符合条件”的判断。

[教学难点]

1、如何确定穷举方案。

2、如何评价各种穷举方案的优劣。

[教学方法]

讲授法、探究法、演练法

[教学课时]

2课时

[教学过程]

穷举法的思路是,列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解答。

穷举算法模式:

(1)问题解的可能搜索的范围:用循环或循环嵌套结构实现;

(2)写出符合问题解的条件;

(3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。

陈婷所在学校的3个环保活动小组经常利用节假日去栽树。有一天,李老师问他们3个小组各栽了多少棵树?

因为李老师是教数学的,陈婷就调皮地回答:“3个小组的栽树数量相乘的积是30723,您能把3个小组的栽树数

量算出来吗?”李老师说:“只有这个条件不能确定答案呀。你能补充点情况吗?’’于是陈婷补充说:“A组都

是大个子同学组成的,栽的树虽然不到100棵,但比另外两组合起来的还要多。栽树最少的C组也早就超过了10棵。

这时李老师说:“那我算出来了。”李老师是怎样算出来的呢?

李老师后来告诉陈婷,她用的是穷举法。

例题一:栽树数量问题的求解

a、b、c是三个整数,100>a>b>c>10, a ×b× C=30723,且a>b+c,试确定a、b、c的值。

(1)分析问题。

解决这个问题应当从a ×b× C=30723人手。把30723分解成三个正整数相乘的积,只能有有限种情况,我们可以把这些情况一一罗列出来,然后分析哪一种情况是符合条件(100>a>b>c>10,且a>b+c)的,从而找到答案(在列举所有情况时,注意三个因子都大于10,这可以减少列举的工作量)。

把30723分解为3个大于10的因子的乘积只有5种情况:11×19×147,11×21×133,19×33×49,11×49× 57,19×21×77。

在这5种情况中符合最大数a大于b+c而且小于100的,只有最后一种情况,即a=77,b=2l,c=19。

(2)设计算法。

设计穷举法的关键是如何列举所有可能的情况,绝对不能遗漏,最好不要重复。在列举时注意变量的范围,可以减少工作量。

我们可以从最小的变量c人手,让它从10开始变化。但变化的范围到哪里为止呢?粗略估算一下,三个数相乘的积是30723,最小的c不会超过积的立方根。但VB语言没有立方根的内部函数,我们可以用平方根作近似的替代,不必作太多的推算。当c值产生之后,就可以处理变量b。因为它不小于c,让它从c开始,也让它变化到30723的平方根。

有了c和b的值之后,就要判断它们的乘积是否30723的因子。如果是,计算出第三个因子a,然后进行判断:a是否大于b+c并且小于100。满足条件的就是解答了。算法描述如下:

①令变量c取值10;

②令变量b取值c;

③如果b×c能整除30723,那么下一步,否则转⑥;

④a=30723÷(b×c);

⑤如果a>b+c并且a<100,那么输出解答a、b、c的值;

⑥如果b< ,那么b值增加1后返回③;

⑦如果c< ,那么c值增加1后返回②;

⑧结束。

(3)编写程序。

根据算法写出程序如下:

(4)调试程序。

本程序没有特别安排其他控件,程序运行后单击窗体可得结果(如下图)。

复核知这个结果是符合题意的。

例题二:

现有面值为l元、2元和5元的钞票(假设每种钞票的数量都足够多),从这些

钞票中取出30张使其总面值为100元,问有多少种取法?输出每种取法中各种面

额钞票的张数。

(1)分析问题

本问题有3种面额的钞票,钞票的总张数是30张,应当如何穷举呢?经分析可

以知道:当有两种面额的钞票数目确定了之后,可以从总张数30确定第三种钞

票的张数,然后由总面额是否100元而判断这个组合是否合乎要求。

(2)设计算法

用a、b、c分别记录1元、2元、5元钞票的张数。变量n记录符合条件的解的

数目。穷举的过程如下:

①让n=0,c=0;

②b=0;

③让a=30-b-c;

④检查5*c+2*b+c是否等于100,若是,则得到一组解,这时让n增加1。并且

输出解答;

⑤如果b<30,那么让b增加1,返回步骤③;

⑥如果c<20,那么让c增加1,返回步骤②;

⑦结束。

把这些步骤用框图表示:

(3)交流

如果首先进行最小面额的钞票的选择,程序代码该如何写?与以上的方法比

较,哪一个程序的判断比较的次数多些?

穷举法的基本思路

穷举法的思路是列举一切与命题相关的情况,然后根据问题设定的条件,逐个加以检查,找到满足条件的解答。但是在穷举时,“与命题相关的情况”所包含的范围可能很广,如果不加以限制可能会白白耗费计算机的运行时间。如上例程序中若把“Sqr(n)”都改为“n/2”,你得等待很长的时间。所以,在设计穷举的过程时,应当建立适当的数学模型,构造穷举的框架,然后通过逐步求精的过程,改善算法,使穷举过程变得恰当。

相关文档
最新文档