雨诺喜乐
枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。基本信息中文名:枚举法外文名:Enumeration method定义:逐个考察了某类事件的所有可能借助:计算机运算速度快精确度高特点结构:while循环算法:二进制加法,此时需要数组来帮忙简介枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。在 数学和 计算机科学理论中,一个集的 枚举是列出某些有穷序列集的所有成员的 程序,或者是一种特定类型对象的 计数。这两种类型经常(但不总是)重叠。特点将问题的所有可能的答案一一 列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如:找出1到100之间的素数,需要将1到100之间的所有 整数进行判断。枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点:1、得到的结果肯定是正确的;2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。3、通常会涉及到求 极值(如最大,最小,最重等)。4、数据量大的话,可能会造成时间崩溃。结构枚举算法的一般结构:while 循环。首先考虑一个问题:将1到100之间的所有整数转换为 二进制数表示。算法一for i:=1 to 100 do begin将i转换为 二进制,采用不断除以2, 余数即为转换为2进制以后的结果。一直除商为0为止。end;算法二二进制加法,此时需要数组来帮忙。program p;var a:array[1..100] of integer; {用于保存转换后的二进制结果}i,j,k:integer;beginfillchar(a,sizeof(a),0); {100个数组元素全部初始化为0}for i:=1 to 100 do begink:=100;while a[k]=1 do dec(k); {找高位第一个为0的位置}a[k]:=1; {找到了立刻赋值为1}for j:=k+1 to 100 do a[j]:=0; {它后面的低位全部赋值为0}k:=1;while a[k]=0 do inc(k); {从最高位开始找不为0的位置}write('(',i,')2=');for j:=k to 100 do write(a[j]); {输出转换以后的结果}writeln;end;end.枚举法,常常称之为 穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。
风舞飞雁
在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法. 一、特点:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如: 找出1到100之间的素数。需要将1到100之间的所有整数进行判断。 枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点: 1、得到的结果肯定是正确的; 2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。 3、通常会涉及到求极值(如最大,最小,最重等)。 二、枚举算法的一般结构:while循环。 首先考虑一个问题:将1到100之间的所有整数转换为二进制数表示。 算法一: for i:=1 to 100 do begin 将i转换为二进制,采用不断除以2,余数即为转换为2进制以后的结果。一直除商为0为止。 end; 算法二:二进制加法,此时需要数组来帮忙。 program p; var a:array[1..100] of integer; {用于保存转换后的二进制结果} i,j,k:integer; begin fillchar(a,sizeof(a),0); {100个数组元素全部初始化为0} for i:=1 to 100 do begin k:=100; while a[k]=1 do dec(k); {找高位第一个为0的位置} a[k]:=1; {找到了立刻赋值为1} for j:=k+1 to 100 do a[j]:=0; {它后面的低位全部赋值为0} k:=1; while a[k]=0 do inc(k); {从最高位开始找不为0的位置} write('(',i,')2='); for j:=k to 100 do write(a[j]); {输出转换以后的结果} writeln; end; end. 枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。 采用枚举算法解题的基本思路: (1) 确定枚举对象、枚举范围和判定条件; (2) 一一枚举可能的解,验证是否是问题的解 下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题。 例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡? 算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。 下面是解这个百鸡问题的程序 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('x=',x,'y=',y,'z=',z); {验证可能的解,并输出符合题目要求的解} end. 上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序: var x,y,z:integer; begin for x:=0 to 100 do for y:=0 to 100-x do begin z:=100-x-y; if (x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); end; end. 未经优化的程序循环了1013 次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次 ,时间复杂度为O(n2)。从上面的对比可以看出,对于枚举算法,加强约束条件,缩小枚举的范围,是程序优化的主要考虑方向。 在枚举算法中,枚举对象的选择也是非常重要的,它直接影响着算法的时间复杂度,选择适当的枚举对象可以获得更高的效率。如下例: 例2、将1,2...9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数. 例如:三个三位数192,384,576满足以上条件.(NOIP1998pj) 算法分析:这是1998年全国分区联赛普及组试题(简称NOIP1998pj,以下同)。此题数据规模不大,可以进行枚举,如果我们不加思地以每一个数位为枚举对象,一位一位地去枚举: for a:=1 to 9 do for b:=1 to 9 do ……… for i:=1 to 9 do 这样下去,枚举次数就有99次,如果我们分别设三个数为x,2x,3x,以x为枚举对象,穷举的范围就减少为93,在细节上再进一步优化,枚举范围就更少了。程序如下: var t,x:integer; s,st:string; c:char; begin for x:=123 to 321 do{枚举所有可能的解} begin t:=0; str(x,st);{把整数x转化为字符串,存放在st中} str(x*2,s); st:=st+s; str(x*3,s); st:=st+s; for c:='1' to '9' do{枚举9个字符,判断是否都在st中} if pos(c,st)<>0 then inc(t) else break;{如果不在st中,则退出循环} if t=9 then writeln(x,' ',x*2,' ',x*3); end; end. 在枚举法解题中,判定条件的确定也是很重要的,如果约束条件不对或者不全面,就穷举不出正确的结果, 我们再看看下面的例子。 例3 一元三次方程求解(noip2001tg) 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。 要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。 提示:记方程f(x)=0,若存在2个数x1和x2,且x1
威斯东wisdom
1,Exhaustive Attack method.穷举法(Exhaustive Attack method),又称为强力法 (Brute-force method). 完全试凑法(complete trial-and – error method) – 这是对截获的密文依次用各种可能的密钥破译. – 对所有可能的明文加密直到与截获的密文一致为止.[参考资料]穷举法_百度百科http://baike.baidu.com/view/79218.htm2, Method of Exhaustion安提丰(Antiphon,约公元前430 年)和布赖森(Bryson,公元前408 - 355 年)想出一个方法计算平面图形面积的方法-「穷举法」(Method of Exhaustion)。[参考资料]数学资料库- 数学趣趣地- 数学文章[ 繁体 ]