150 likes | 289 Views
《 用穷举法解决问题的实践 》. 湖南省常德市鼎城区第一中学 周子春. 学习目标. 了解穷举法的概念 了解应用穷举法设计算法的过程 能够根据问题的具体的要求,利用穷举法设计算法和编写程序解决问题。. 课题导入. 思考:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡。问鸡翁、母、雏各几何?”. 即:公鸡一只值 5 元,鸡母一只值 3 元,小鸡三只值 1 元。现在有 100 只鸡,正好值 100 元钱,问公鸡、母鸡和小鸡各有几只?. 怎样解决这样的问题呢? 这样的问题是没有规律的 , 我们只能采用穷举法逐一进行验证,一组一组的将符合条件的数找出来。.
E N D
《用穷举法解决问题的实践》 湖南省常德市鼎城区第一中学 周子春
学习目标 • 了解穷举法的概念 • 了解应用穷举法设计算法的过程 • 能够根据问题的具体的要求,利用穷举法设计算法和编写程序解决问题。
课题导入 思考:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡。问鸡翁、母、雏各几何?” 即:公鸡一只值5元,鸡母一只值3元,小鸡三只值1元。现在有100只鸡,正好值100元钱,问公鸡、母鸡和小鸡各有几只? 怎样解决这样的问题呢? 这样的问题是没有规律的,我们只能采用穷举法逐一进行验证,一组一组的将符合条件的数找出来。
用穷举法解决问题的思想 • 穷举方法是基于计算机特点而进行解题的思维方法。 • 一般是根据问题中的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一 一验证是否符合整个问题的求解要求,而得到问题的解。这样解决问题的方法我们称之为穷举算法。穷举算法特点是算法简单,但运行时所花费的时间量大。因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。
穷举法的一般模式 • 分析问题的可能范围,然后设计循环或者循环嵌套结构算法 • 探究、挖掘出问题解的约束条件 • 根据约束条件优化算法,尽可能地缩小穷举范围,减少穷举次数,降低算法的时间和空间复杂度。
穷举法应用示例 • 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡。问鸡翁、母、雏各几何? 分析:鸡翁数的可能范围:0~100/5 鸡母数的可能范围:0~100/3 雏鸡数的可能范围:0~100 百钱买百鸡 范围 雏鸡的另一种思维范围:100-鸡翁数-鸡母数 限制条件:
穷举法应用示例 设X表示公鸡只数,Y表示母鸡只数,Z表示小鸡只数。 那么: X穷举范围:. Y穷举范围:. Z穷举范围:. Z优化设置: . Private Sub Command1_Click() Dim x As Integer, y As Integer, z As Integer For x = 0 To 20 For y = 0 To 33 For z = 0 To 100 If x + y + z = 100 And x * 5 + y * 3 + z / 3 = 100 Then Print "公鸡数为" & x Print "母鸡数为" & y Print "仔鸡数为" & z Print Else End If Next z Next y Next x End Sub 0---100/5 0---100/3 0---100 100-x-y 限制条件:百鸡百钱
穷举法应用示例 优化程序设计 (Private Sub Command1_Click() Dim x As Integer, y As Integer, z As Integer For x = 0 To 20 For y = 0 To 33 z = 100 - x - y If x + y + z = 100 And x * 5 + y * 3 + z / 3 = 100 Then Print "百钱百鸡方案:" Print "公鸡数为" & x Print "母鸡数为" & y Print "仔鸡数为" & z Print Else End If Next y Next x End Sub)
穷举法应用实践 • 寻找阿姆斯特朗数----一个n位自然数的各位数字的n次方之和等于它本身。如:水仙花数:153=13+53+33 玫瑰花数:8208=84+24+04+84 分析: 水仙花数的百位范围1-9,十位范围0-9,个位范围0-9 约束条件:该数的个、十、百位数的立方和正好是等于该数本身 程序结构选择:三重循环 玫瑰花数的千位范围1-9,百位范围0-9,十位范围0-9,个位范围0-9 约束条件:该数的个、十、百、千位数的4次方和正好等于该数本身 程序结构选择:四重循环 分析: 水仙花数范围100-999 约束条件:该三位数的各位数的立方和正好是等于该数本身 程序结构选择:设计一重循环 玫瑰花数范围1000-9999 约束条件:该四位数的各位数的4次方和正好等于该数本身 程序结构选择:设计一重循环
穷举法应用实践 • 寻找阿姆斯特朗数 水仙花数:153=13+53+33 Private Sub Command1_Click() Dim x As Integer, a As Integer, b As Integer, c As Integer Print "水仙花数有" Print For x = 100 To 999 a = Int(x / 100) b = Int((x - a * 100) / 10) c = Int(x - a * 100 - b * 10) If a ^ 3 + b ^ 3 + c ^ 3 = x Then Print x; End If Next x End Sub
穷举法应用实践 • 寻找阿姆斯特朗数 玫瑰花数:8208=84+24+04+84 Private Sub Command1_Click() '玫瑰花数:如1634、8208、9474等 Dim x As Integer, a As Integer, b As Integer, c As Integer Print "玫瑰花数有" Print For x = 1000 To 9999 a = Int(x / 1000) b = Int((x - a * 1000) / 100) c = Int((x - a * 1000 - b * 100) / 10) d = Int(x - a * 1000 - b * 100 - c * 10) If x = a ^ 4 + b ^ 4 + c ^ 4 + d ^ 4 Then Print x; End If Next x End Sub
穷举法应用探究 • 有一根长为600cm的钢筋,需要截成长度为69cm、39cm、29cm的三种规格的短料,在三种规格的短料至少各截l根的前提下,如何截取才能使所余下的材料最少? Private Sub Command1_Click() For i = 1 To Int(600 / 69) For j = 1 To Int(600 / 39) For k = 1 To Int(600 / 29) t = i * 69 + j * 39 + k * 29 If t < 600 And 600 - t <= 1 Then Print i, j, k End If Next k Next j Next i End Sub 问题拓展: 有一根长为dcm的钢筋,需要截成长度为mcm、ncm、scm的三种规格的短料,在三种规格的短料至少各截l根的前提下,如何截取才能使所余下的材料最少? (这里请思考最少的限度值如何确定) (答案:这三种规格分别截取6、4、l根时余料最少)。
穷举法应用探究 • 如果一个正整数的立方能够分解为另外三个数的立方和,那么我们称这个数为“好数”。即:若A、X、Y、Z都是正整数,且满足:A3=X3+Y3+Z3,则A称为好数。如63=33+43+53,试设计一个求好数的程序。 Private Sub Command1_Click() a = 6 k = 1 Do a = a + 1 For i = 1 To a - 1 For j = 1 To a - 1 For z = 1 To a - 1 If a ^ 3 = i ^ 3 + j ^ 3 + z ^ 3 Then Print a, i, j, z k = k + 1 i = a j = a z = a End If Next z Next j Next i Loop Until k > 10 End Sub Private Sub Command1_Click() a=6 k=1 do while k<=10 a=a+1 for i=1 to a-1 for j=1 to a-1 for z=1 to a-1 if a^3=i^3+j^3+z^3 then print a,i,j,z k=k+1 i=a j=a z=a end if next z next j next i loop End Sub
课堂小结 (1)本堂课明确了穷举法的概念 (2)介绍了穷举法设计算法的过程 (3)学会了根据具体的问题的要求,使用穷举法算法编写程序求解问题。