算法(穷举法)第二讲.ppt

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法(穷举法)第二讲

穷举法 穷举法的一般模式 列出问题的可能范围,一般用循环或者循环嵌套结构来实现 探究、挖掘出问题解的约束条件 根据约束条件优化算法,尽可能地缩小穷举范围,减少穷举次数,降低算法的时间和空间复杂度。 穷举法的应用举例1 1.判断2000~2500年中的每一年是否为闰年。 自然语言描述: 设y为被检测的年份,则算法可表示如下: S1:2000→y; S2:若y不能被4整除,则输出y“不是闰年”,然后转到S6; S3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转到S6; S4:若y能被100整除,又能被400整除,输出y“是闰年” ,然后转到S6; S5:输出y“不是闰年”,然后转到S6; S6:y+1→y; S7:当y≤2500时, 返回S2继续执行,否则结束。 流程图 C语言程序 #include stdio.h void main() { int y=2000; while (y=2500) { if((y%4)==0) { if(y%100!=0) printf( %d 年是闰年\n,y); else if(y%400==0) printf( %d 年是闰年\n,y); else printf( %d 年是非闰年\n,y); } else printf( %d 年是非闰年\n,y); y=y+1; } } 穷举法的应用举例2 百钱百鸡问题:相传我国南北朝时,京城有个卖鸡的张姓老汉,他有一个儿子非常聪明,尤其擅长算术,到十二三岁时已是远近闻名的“小神童”了。当朝宰相听说后想试探个究竟,于是派仆人到张老汉的店里打听鸡的价钱,张老汉告知“公鸡五文钱一只,母鸡三文一只,小鸡一文三只”。于是,仆人给他一百文钱,要求公鸡、母鸡、小鸡都要,数量不多不少正好一百只,命他次日送到府上。这可难为了张老汉,他怎么凑也凑不够这个数,只好问儿子。“小神童”不慌不忙,掐指一算就给出了答案,第二天照数送到宰相府。宰相见难不倒“小神童”,又让仆人给张老汉一百文钱,要求再买一百只鸡,搭配方法不能和上次一样。结果“小神童”又很快给出了答案,宰相暗暗称奇,想最后再试一次,谁知还是没有难倒“小神童”。 这个故事就是我国古代数学名著《张邱建算经》里的百鸡百钱问题。请用穷举法求解所有的组合方法。 自然语言描述: 题目分析与算法设计 设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程: ? 5x+3y+z/3=100? x+y+z=100? 所以此问题可归结为求这个不定方程的整数解。? 由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。 流程图 C语言程序 includestdio.h?? main()?? {?? int?x,y,z;?? for(x=0;x=20;x++)?? for(y=0;y=33;y++)?? ? {if(5*x+3*y+z/3==100z%3==0)?? printf(“cock=%d;hen=%d;chicken= %d\n,x,y,z);}?? } 我们使用信用卡在柜员机上取钱时,为什么系统要限制输入密码的次数? 小结 1、穷举法分析: ⑴确定范围 ⑵验证条件 2、自觉遵守网络道德与法规 穷举法的作业 1、换零钱问题。将一元钱换成1分,2分或5分的零钱有多少种换法? C程序 #include stdio.h #include stdlib.h int main() { int one,two,five,num=0; for(one=0;one=100;one++) for(two=0;two=50;two++) for(five=0;five=20;five++) if(one+two*2+five*5==100){num++; printf(100=%d*1+%d*2+%d*5\n,one,two,five);} printf(\n%d possibilities\n,num); } * * 1.什么是穷举法? 也叫枚举法、列举法   ——将求解对象一一列举出来,然后逐一加以分析、处理,并验证结果是否满足给定的条件,穷举完所有

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档