资源简介 (共18张PPT)枚举算法及其优化山东省济南第一中学焦学仕枚举法(又称穷举法)是指一一列举出所有与问题相关的情况,然后根据问题设定的条件,逐个加以检查判断,找到满足条件的解的方法。枚举算法的概念枚举算法的实现过程二、在一定的范围内进行列举一、对枚举的每一组数据进行检验在不遗漏正确解的前提下,枚举范围尽可能的缩小以提高效率如果结果唯一,数据一旦检验成功则结束枚举,输出答案、提前结束程序;如果结果不唯一,则一定要检验可能范围内的所有数据,并输出答案。枚举算法及其优化例题百钱买百鸡设1个公鸡值5钱,1个母鸡值3钱,3个小鸡值1钱。现用100钱来买100只鸡。问:公鸡、母鸡、小鸡各买多少只?(公鸡、母鸡、小鸡每种最少一只)【分析】公鸡的数量x:最少1只,不超过只母鸡的数量y:最少1只,不超过只小鸡的数量z:最少1只,不超过只①5x+3y+z/3=100②x+y+z=100满足条件:2033100程序实现importtimecishu=0#初始循环次数为0starttime=time.perf_counter()#枚举开始时读取系统当前时间forxinrange(1,20):foryinrange(1,33):forzinrange(1,100):cishu+=1#每循环一次,次数加1ifx5+y3+z/3==100andx+y+z==100:print(x,y,z)endtime=time.perf_counter()#枚举完成时读取系统当前时间totaltime=endtime-starttimeprint('共循环%.f次'%cishu)print('总共耗时:%.6f秒'%totaltime)用三重循环来枚举所有的情况优化策略之一:剪枝法缩小枚举范围来提高解决问题的效率。同时也要避免重复枚举。优化分析百钱买百鸡设1个公鸡值5钱,1个母鸡值3钱,3个小鸡值1钱。现用100钱来买100只鸡。问:公鸡、母鸡、小鸡各买多少只?(公鸡、母鸡、小鸡每种最少一只)【分析】公鸡的数量x:最少1只,不超过只母鸡的数量y:最少1只,不超过只小鸡的数量z:只100-x-y2033(提示:小鸡的数量可不可以用x,y来表示?)importtimecishu=0#初始循环次数为0starttime=time.perf_counter()#枚举开始前读取系统当前时间forxinrange(1,20):foryinrange(1,33):z=100-x-ycishu+=1#每循环一次,次数加1ifx5+y3+z/3==100:print(x,y,z)endtime=time.perf_counter()#枚举完成时读取系统当前时间totaltime=endtime-starttimeprint('共循环%.f次'%cishu)print('总共耗时:%.6f秒'%totaltime)优化后的程序优化后由三重循环变成两重循环importtimecishu=0starttime=time.perf_counter()forxinrange(1,20):foryinrange(1,33):z=100-x-ycishu+=1ifx5+y3+z/3==100:print(x,y,z)endtime=time.perf_counter()total=endtime-starttimeprint('共循环%.f次'%cishu)print('总共耗时:%.6f秒'%total)优化前后程序对比importtimecishu=0starttime=time.perf_counter()forxinrange(1,20):foryinrange(1,33):forzinrange(1,100):cishu+=1ifx5+y3+z/3==100andx+y+z==100:print(x,y,z)endtime=time.perf_counter()totaltime=endtime-starttimeprint('共循环%.f次'%cishu)print('总共耗时:%.6f秒'%totaltime)循环由三重变为两重,判断条件少了x+y+z=100(思考:为什么可以去掉?)借助数学知识继续优化:第一步:使用加减消元的方法消掉一元,比如z,然后用x来表示y和z第二步:令x=4k,则有第三步:根据题目中x,y,z的范围,列出不等式组:第四步:求出,forkinrange(1,4):x=4ky=25-7kz=3k+75print(x,y,z)终极优化终极优化之后,只有3次循环!至此,可以明确,只要求出k值,公鸡、母鸡、小鸡的数目就确定了,而0充分运用数学工具,通过计算,在约束条件下,找出目标函数的最优解,大大提高了运行效率!优化策略之二:数学优化形如a3=b3+c3+d3的等式被称为完美立方等式。例如123=63+83+103。编写一个程序,输出100以内的完美立方组合,其中a,b,c,d大于1,小于100,且bforainrange(2,100):forbinrange(1,100):forcinrange(1,100):fordinrange(1,100):ifa3==b3+c3+d3:print(a,b,c,d)完美立方枚举优化练习形如a3=b3+c3+d3的等式被称为完美立方等式。例如123=63+83+103。编写一个程序,输出100以内的完美立方,其中a,b,c,d大于1,小于100,且bforainrange(2,100):forbinrange(1,):forcinrange():fordinrange():ifa3==b3+c3+d3:print(a,b,c,d)完美立方程序优化ab,ac,a思考:a和b、c、d的大小关系a>d>c>b1100bcda总结枚举法又叫穷举法,是指把所有可能的组合都列出来一个一个取分析,找出所有的正确结果。枚举法算法简单,但是效率不高,一般在解得数量不多,并且解是可以计算、固定不变的情况下才可以使用。枚举法可以使用剪枝法、数学计算法进行优化,以提高运行效率。课后练习五位数假定一个五位数abcde满足条件abcde×a=eeeeee,求出该五位数。课后思考:如何优化?广东教育出版社必修一第四章《程序设计基础》4.4.3枚举算法及其优化评测练习形如的等式被称为完美立方等式。例如。编写一个程序,输出100以内的完美立方组合,其中a,b,c,d大于1,小于100,且b1、数轴上标出a、b、c、d的大小关系:2、a、b、c、d的取值范围:a:b:c:d:3、填写完美立方程序importtimestarttime=time.perf_counter()zuhe=0cishu=0forainrange(2,):forbinrange(,):forcinrange(,):fordinrange(,):cishu+=1if:print(a,b,c,d)zuhe+=1endtime=time.perf_counter()totaltime=endtime-starttimeprint('总共有%.f种组合'%zuhe)print('共循环%.f次'%cishu)print('总共耗时:%.2f秒'%totaltime)11004.4.3枚举算计及其优化一、学科核心素养(1)针对给定的任务进行需求分析,明确需要解决的关键问题。(2)能提取问题的基本特征,进行抽象处理,并用形式化的方法表述问题。(3)运用基本算法设计解决问题的方案,能使用编程语言或其他数字化工具实现这一方案。(4)针对不同模块,设计或者选择合适的算法,利用编程语言或其他数字化工具实现各模块功能。二、内容要求必修课程模块1:1.7掌握一种程序设计语言的基本知识,使用程序设计语言解决实际问题,体验程序设计的基本流程,感受算法的效率,掌握程序运行和调试的方法。三、学业要求【信息意识】能够根据解决问题的需要,自觉、主动地寻求恰当的方式获取与处理信息【计算思维】1、能够采用计算机科学领域的思想方法界定问题、抽象特征、建立结构模型。2、依据解决问题的需要,设计和表示简单算法;掌握一种程序设计语言的基本知识,利用程序设计语言实现简单算法,解决实际问题。【数字化学习与创新】适应数字化学习环境,养成数字化学习与创新的习惯,握数字化学习工具的操作技能,四、学习目标1、通过实例进一步理解枚举算法2、掌握枚举算法的两种优化方法,剪枝优化法与数学优化法。五、学习重难点:重点:枚举法的两种优化方法难点:枚举算法中的数学优化法。六、教学素材准备:纸质学习任务单、网络共享在线excel文档、压缩后的作业文件、python程序。七、教学过程环节一:情景导入引导学生按照组别分别下载本组作业,并尝试解压缩思考:1、文件是否能成功解压缩?2、如何破解密码?靠猜密码是否行的通?3、这是一个四位数组成的密码,如果编写程序,可以使用什么样的算法?4、尝试使用python程序暴力破解密码,注意修改被破解的文件名5、每组组长填写在线共享excel文档,记录破解后的密码及破解时间6、各组破解的时间相同吗?为什么?7、从暴力破解所用的时间上来看,我们设定密码应该注意什么?环节二:百钱买百鸡的优化一、枚举法的概念枚举法又称穷举法,是指一一列举出所有与问题相关的情况,然后根据问题设定的条件,逐个加以检查判断,找到满足条件的解的方法。二、枚举算法的实现过程1、对枚举的每一组数据进行检验如果结果唯一,数据一旦检验成功则结束枚举,输出答案、提前结束程序;如果结果不唯一,则一定要检验可能范围内的所有数据,并输出答案。2、在一定的范围内进行列举在不遗漏正确解的前提下,枚举范围尽可能的缩小以提高效率三、百钱买百鸡及优化问题:百钱买百鸡设1个公鸡值5钱,1个母鸡值3钱,3个小鸡值1钱。现用100钱来买100只鸡。问:公鸡、母鸡、小鸡各买多少只?(公鸡、母鸡、小鸡每种最少一只)【分析】公鸡的数量x:最少1只,不超过只母鸡的数量y:最少1只,不超过只小鸡的数量z:最少1只,不超过只满足条件:①5x+3y+z/3=100②x+y+z=100【程序实现】用三重循环来枚举所有的情况importtimecishu=0#初始循环次数为0starttime=time.perf_counter()#枚举开始时读取系统当前时间forxinrange(1,):foryinrange(1,):forzinrange(1,):cishu+=1#每循环一次,次数加1ifx5+y3+z/3==100andx+y+z==100:print(x,y,z)endtime=time.perf_counter()#枚举完成时读取系统当前时间totaltime=endtime-starttimeprint('共循环%.f次'%cishu)print('总共耗时:%.6f秒'%totaltime)【优化策略之一】剪枝法缩小枚举范围来提高解决问题的效率。同时也要避免重复枚举。【优化分析】进一步分析百钱买百鸡暗含的条件范围:设1个公鸡值5钱,1个母鸡值3钱,3个小鸡值1钱。现用100钱来买100只鸡。问:公鸡、母鸡、小鸡各买多少只?(公鸡、母鸡、小鸡每种最少一只)【分析】公鸡的数量x:最少1只,不超过只母鸡的数量y:最少1只,不超过只小鸡的数量z:只提示:小鸡的数量可不可以用x,y来表示?【优化后的程序】优化后由三重循环变成两重循环importtimecishu=0#初始循环次数为0starttime=time.perf_counter()#枚举开始前读取系统当前时间forxinrange(1,):foryinrange(1,):z=cishu+=1#每循环一次,次数加1ifx5+y3+z/3==100:print(x,y,z)endtime=time.perf_counter()#枚举完成时读取系统当前时间totaltime=endtime-starttimeprint('共循环%.f次'%cishu)print('总共耗时:%.6f秒'%totaltime)环节三:学以致用枚举优化练习完美立方形如a3=b3+c3+d3的等式被称为完美立方等式。例如123=63+83+103。编写一个程序,输出100以内的完美立方组合,其中a,b,c,d大于1,小于100,且b分析并填写:1、数轴上标出a、b、c、d的大小关系:2、a、b、c、d的取值范围:a:b:c:d:3、完善程序并调试,填写下表forainrange(2,100):forbinrange(1,):forcinrange():fordinrange():ifa3==b3+c3+d3:print(a,b,c,d)4、调试程序填写下表100内完美立方共有(组)循环次数(次)耗时(秒)环节四:总结枚举法又叫穷举法,是指把所有可能的组合都列出来一个一个取分析,找出所有的正确结果。枚举法算法简单,但是效率不高,一般在解得数量不多,并且解是可以计算、固定不变的情况下才可以使用。枚举法可以使用剪枝法、数学计算法进行优化,以提高运行效率。环节五、课后练习编写程序,得出答案,并使用本节所学优化方法进行优化。求解五位数假定一个大于0的五位数abcde满足条件abcde×a=eeeeee,求出该五位数。11003 展开更多...... 收起↑ 资源列表 广东教育出版社必修一第四章《程序设计基础》4.4.3枚举算法及其优化.doc 广东教育出版社必修一第四章《程序设计基础》4.4.3枚举算法及其优化.ppt 广东教育出版社必修一第四章《程序设计基础》4.4.3枚举算法及其优化评测练习.doc