信息学奥赛中的基本算法(枚举法)枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的
能使命题成立者,即为问题的解
采用枚举算法解题的基本思路:(1)确定枚举对象、枚举范围和判定条件;(2)一一枚举可能的解,验证是否是问题的解下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题
枚举算法应用例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡
到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只
现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡
算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数
下面是解这个百鸡问题的程序varx,y,z:integer;beginforx:=0to100dofory:=0to100doforz:=0to100do{枚举所有可能的解}if(x+y+z=100)and(x*3+y*2+zdiv3=100)and(zmod3=0)thenwriteln('x=',x,'y=',y,'z=',z);{验证可能的解,并输出符合题目要求的解}end
上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序:varx,y,z:integer;beginforx:=0to100dofory:=0to100-xdobeginz:=100-x-y;if(x*3+y*2+zdiv3=100)and(zmod3=0)th