ACM蛮力法解读.ppt

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

蛮力法 【暴力、枚举、穷举……】 所谓蛮力法,是指从可能的解集合(空间)中一一列举各情况,用题目给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。 采用蛮力法解题的基本思路如下: (1)建立问题的数学模型,确定问题的可能解的集合(可能解的空间)。 (2)逐一列出可能解集合中的元素,验证是否是问题的解。 程序优化的主要考虑方向是:通过加强约束条件,缩小可能解的集合的规模。 蛮力算法 使用伪代码可以描述为: for each s in S //S是问题所有可能解的集合 if s is a solution then begin Write(s); exit the program; end; 例题:寻找水仙花数 一个三位数其各位数字的立方和等于它本身,这 样的数称为水仙花数。要求找出所有的水仙花数 分析:所求一定是三位数,所以范围一定在100-999之间,只要将这些数逐一列举,符合条件者为解 枚举算法 For a:=100 to 999 do { b:=a mod 10; //取出个位 c:=(a div 10) mod 10 //取出十位 d:= a div 100 //取出百位 if (a=b*b*b+c*c*c+d*d*d) then writeln(a) } 例题:百鸡问题 有一个人有一百块钱,打算买一百只鸡。到市场一看,公鸡三块钱一只,母鸡两块钱一个,小鸡一块钱三只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡? 按照枚举算法的思路,首先应该构造可能解的集合:S={(x,y,z)|0≤x,y,z≤100},其中三元组(x,y,z)表示买公鸡x只,母鸡y只和小鸡z只。因为一共需要买100只鸡,因此,买公鸡、母鸡和小鸡的数量都不会超过100。然后确定验证解的条件:x+y+z=100 and 3x+2y+z/3=100。 Var x,y,z:integer; begin //枚举可能解空间的元素 for x:=0 to 100 do for y:=0 to 100 do for z:=0 to 100 do if (x+y+z=100) and (x*3+y*2+z div 3=100) and (z mod 3=0) //验证可能解 then WriteLn(Format((x,y,z)=(%3d,%3d,%3d),[x,y,z])); end. 程序输出结果为: (x,y,z)=( 0, 40, 60) (x,y,z)=( 5, 32, 63) (x,y,z)=( 10, 24, 66) (x,y,z)=( 15, 16, 69) (x,y,z)=( 20, 8, 72) (x,y,z)=( 25, 0, 75) 有6种可选的方案。 程序需要循环100^3,即|S|=100^3。我们通过条件x+y+z=100来约束求解空间,缩小可能解的集合的规模:  ...... begin //枚举可能解空间的元素 for (x=0;x=100;x++) for (y=0;y=100-x;y++) begin z:=100-x-y;  if (x+y+z=100) and (x*3+y*2+z div 3=100) and (z mod 3=0) ...... end; end. 两个程序运行结果相同,但是,优化后,后者的循环次数为100*101/2,是前者循环次数的1/200左右。 古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把 ABCDE 所代表的数字写出来。 答案写在“解答.txt”中,不要写在这里! 注意首位和末位是否为0的情况。 枚举算法适用范围: 简单数值判断题; 简单逻辑判断题; 数据规模不大的问题; 没有想到更好解法的题,可用枚举求出一定范围内的解。 但:对于枚举算法,程序优化的主要考虑方向是:通过加强约束条件,缩小可能解的集合的规模。 简单,但是慎用!要注意问题的规模。很可能会超出时间限制,导致报错! 把一元钞票换成一分、二分、五分硬币(每种至少一

文档评论(0)

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

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

1亿VIP精品文档

相关文档