第三课 提高班 枚举模拟.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三课 提高班 枚举模拟.ppt

枚举算法 主讲:兰椿森 什么是枚举 枚举,通俗地讲就是把所有的可能一个个列举出来 比如:一周有星期一、星期二、星期三、星期四、星期五、星期六、星期天; 警察破案时罗列出所有的犯罪嫌疑人 百钱买百鸡问题 一百个铜钱买了一百只鸡,其中公鸡一只 5 钱、母鸡一只 3 钱,小鸡3 只一 钱 ,问一百只鸡中公鸡、母鸡、小鸡各多少 传统数学方法 枚举法 传统数学方法 设一百只鸡中公鸡、母鸡、小鸡分别为 x,y,z,问题化为三 元一次方程组:? 5 x + 3 y + z / 3 = 100(百钱) ? ? x + y + z = 100(百鸡) 可是计算机没有你那么聪明,它自己不会解方程,怎么办? 枚举法 这里 x,y,z 为正整数,由于鸡的总数是 100,可以确定x,y,z 的取值范围:0=x,y,z=100,对于这个问题我们可以用枚举的方法,枚举 x,y,z 的所有可能组合,最后得到问题的解 for(int i=0;i=100;i++) for(int j=0;j=100;j++) for(int k=0;k=100;k=k+3) 优化后的枚举算法 公鸡最多买20只,母鸡最多买33只,小鸡最多买100只,于是。。。 for(int i=0;i=20;i++) for(int j=0;j=33;j++) for(int k=0;k=100;k=k+3) 继续优化 一旦公鸡和母鸡确定了,小鸡的数量也就确定了,所以不用再枚举小鸡的数量 for(int i=0;i=20;i++) for(int j=0;j=33;j++) int k=100-i-j; 运算次数从21780次减少到660次 时间性能从O(n^3)提升到O(n^2) 小结 从上面的对比可以看出,对于枚举算法,加强约束条件,缩小枚举的范围,是程序优化的主要考虑方向。在枚举法解题中,判定条件的确定是很重要的,如果约束条件不对或者不全面,就穷举不出正确的结果。 三位数 求所有的三位数,它除以11所得的余数等于它的三个数字的平方和。 解题思路:三位数只有900个,可用枚举法解决,枚举时可先估计有关量的范围,以缩小讨论范围,减少计算量。 解法 解:设这个三位数的百位、十位、个位的数字分别为x,y,z。由于任何数除以11所得余数都不大于10,所以   x2+y2+z2≤10,   从而1≤x≤3,0≤y≤3,0≤z≤3。所求三位数必在以下数中:   100,101,102,103,110,111,112,120,121,122,130   200,201,202 ,211,212,220,221   300,301,310   不难验证只有100,101两个数符合要求。 完美立方 (POJ1543) 问题描述: a3 = b3 + c3 + d3为完美立方等式。例如123 = 63 + 83 + 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 + d3,其中1a, b, c, d ≤N。 输入:正整数N (N≤100) 输出:每行输出一个完美立方,按照a的值,从小到大依次输出。当两个完美立方等式中a的值相同,则依次按照b、c、d进行非降升序排列输出,即b值小的先输出、然后c值小的先输出、然后d值小的先输出。 样例 样例输入:24 样例输出: Cube = 6, Triple = (3,4,5) Cube = 12, Triple = (6,8,10) Cube = 18, Triple = (2,12,16) Cube = 18, Triple = (9,12,15) Cube = 19, Triple = (3,10,18) Cube = 20, Triple = (7,14,17) Cube = 24, Triple = (12,16,20) 代码 逐一枚举a,b,c,d #include stdio.h main(){ int n, i,a,b,c,d , cube[101]; scanf(%d,n); for(i=0;i=n;i++) cube[i]=i*i*i; for(a=2;a=n;a++) for(b=2;ba;b++) for(c=b;ca;c++) for(d=c;da;d++) if(cube[a] == cube[b]+cube[c]+cub

文档评论(0)

duyingjie1 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档