谈谈用枚举算法解决问题的编程思路与步骤方法

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

谈谈用枚举算法解决问题的编程思路与步骤方法

一.问题

上海市普通高中在信息科技学科中开展《算法与程序设计》教学,教材中有一章名为“算法实例”的内容,其中有一节介绍“枚举算法”。教材中关于枚举算法的描述:有一类问题可以采用一种盲目的搜索方法,在搜索结果的过程中,把各种可能的情况都考虑到,并对所得的结果逐一进行判断,过滤掉那些不合要求的,保留那些符合要求的。这种方法叫做枚举算法(enumerative algorithm)。

枚举法就是按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。在列举的过程中,既不能遗漏也不应重复。

生活和工作中,人们经常会不经意间运用“枚举算法”的基本原理,进行问题的解决。比如,让你用一串钥匙,去开一把锁,但是不知道具体是用哪一把钥匙,你就会一把一把地挨个地逐个尝试,最终打开锁为止。又如,要对1000个零件,进行合格检验,等等。

二.用枚举算法的思想编写程序的思路与步骤

枚举算法,归纳为八个字:一一列举,逐个检验。在实际使用中,一一列举;采用循环来实现,逐个检验:采用选择来实现。

下面,通过一个问题的解决来说明这一类问题的解决过程的方法与步骤;

例1:在1—2013这些自然数中,找出所有是37倍数的自然数。

这个问题就可以采用枚举算法来解决:

1).一一列举;采用循环来实现;

循环需要确定范围:本循环控制变量假设用i,起始值是1,终止值是2013。

2).逐个检验:采用选择来实现;

选择需要列出判断的关系表达式:i Mod 37 = 0

这样,就可以写出整个求解的VB代码:

Dim i As Integer

For i = 1 To 2013

If i Mod 37 = 0 Then

Print i

End If

Next i

说白了,用枚举算法解决问题,其实是利用计算机的高速度这一个优势,就好比上题完全可以使用一张纸和一支笔,采用人工的方法完成问题的解,从1开始,一一试除以37,这样计算2013次,也可以找到问题的答案。

在教学中,问题的求解往往是针对数学上的问题,下面举一些相关的例子,来巩固与提高采用枚举算法进行程序设计的技能。

三.枚举算法举例:

1:一张单据上有一个5位数的编号,万位数是1,千位数是4,百位数是7,个位数、十位数已经模糊不清。该5位数是57或67的倍数,输出所有满足这些条件的5位数的个数。(147□□)

1).一一列举;采用循环来实现;

循环需要确定范围:本循环控制变量假设用i,起始值是0,终止值是99。

2).逐个检验:采用选择来实现;

选择需要列出判断的关系表达式:

(14700 + i) Mod 57 = 0 Or (14700 + i) Mod 67 = 0

这样,就可以写出整个求解的VB代码:

Dim n As Integer

Dim i As Integer

n = 0

For i = 0 To 99

If (14700 + i) Mod 57 = 0 Or (14700 + i) Mod 67 = 0 Then

n = n + 1

Print (14700 + i)

End If

Next i

Print n

2:找水仙花数(若三位数x=100a+10b+c,满足a^3+b^3+c^3=x,则x为水仙花数)

1) 三位数的范围:i = 100 -- 999

2) 条件表达式:为了使用题目中的条件,需要把一个三位数i,拆分成三个一位数字,然后才可以进行条件a^3+b^3+c^3 = i。

************************************************************************** 注意:由于需要把一个多位自然数拆分成若干个一位数字,即分离出每一个数位上的数字,这里介绍常用的方法;

在小学阶段刚开始学习除法,我记得老师是这么在黑板上写的;

8 ÷5 = 1 (3)

老师告诉我们,8是被除数,5是除数,1是商,3是余数。

在VB中,提供了可以获得在这样的除式运算中的运算符号(\、Mod):

8 \ 5 得到的结果是商1

8 Mod 5得到的结果是余数3

例如:26 \ 6 = 4,26 Mod 6 = 2

**************************************************************************

这样,就可以写出整个求解的VB代码:

Dim i As Integer

Dim a As Integer ‘存放百位数字

Dim b As Integer ‘存放十位数字

Dim c As Integer ‘存放个位数字

For i = 100 To 999 ‘循环实现一一列举

‘拆分出百、十、个位数字

a = i \ 100 ‘假设i为123,a = 123 \ 100 = 1

b = i \ 10 Mod 10 ‘b = i \ 10 Mod 10 = 123 \ 10 Mod 10 = 12 Mod 10 = 2

c = i Mo

d 10 ‘c = i Mod 10 = 123 Mod 10 = 3

‘这样就可以利用题目中的条件进行判断

If i = a ^ 3 + b ^ 3 + c ^3 Then

Print i

End If

Next i

3.求方程5X + 4Y = 2 的整数解。

我们知道,采用消元法解方程组的基本规则是,有几个未知数,就要有几个方程。而本题只有一个方程,却要解2个未知数,数学中把这一类方程叫做不定方程。理论上,不定方程有无数个解。道理很简单,上述这个方程,如果在实数内求解,只要任意假设一个X(或者Y),代入方程,就可以解得Y(或者X),例如,假设X=1,那么Y=-0.75,如果要在整数范围内求解,把上述等式变形为:

当X = 2时,Y = -2

当X = 6时,Y = -7

当X = 10时,Y = -12

……

而用程序设计的方法,采用枚举算法解本题,方法还是如上所说:

1)一一列举:用循环,现在要采用双重循环:

外循环用X = -50 – 50,内循环用Y = -100 – 100,当然,从循环的道理来讲,内外循环互换位置,结果一样。

2)逐个检验:用选择,条件为:5X + 4Y = 2

这样可以,求得所有满足题意的整数解,现在题目又拐了个弯,要求满足5X + 4Y = 2,确使得X + Y的和为最大的解,那当然要采用一些额外的方法,进行最大值的计算。最大值计算,无非是我们学过的打擂台的思路。

这样,就可以写出整个求解的VB代码:

Dim x As Integer

Dim y As Integer

Dim MaxX As Integer

Dim MaxY As Integer

Dim Max As Integer

Max = -9999

For x = -50 To 50

For y = -100 To 100

If 5 * x + 4 * y = 2 Then

If x + y > Max Then

Max = x + y

MaxX = x

MaxY = y

End If

End If

Next y

Next x

Print "X="; MaxX, "Y="; MaxY, Max

4.抓交通肇事犯:一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但是

相关文档
最新文档