**
算法定义
**
枚举算法(Exhaustion Attack method,也称作“穷举法”)是指从可能的集合中一一列举出各个元素,用题目给定的约束条件判断那些是无用的,那些是有用的。能使命题成立者即为问题的解。
枚举算法效率并不高,但是适合于一些没有明显规律可循的场合。
能解决什么问题(应用场合)
根据算法的定义,可以发现该算法有如下特点:
(1)题目的答案是一个有穷的集合,即答案可以被一一列举出来;
(2)题目存在给定的约束条件,根据条件可以判断哪些答案符合要求,哪些答案不符合要求。
(3)算法存在循环运算,一般使用while循环实现。
**
算法的优缺点
**
优点:思路简单,无论是程序编写,还是调试都很方便。如果题目不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法。
缺点:是运算量比较大,解题效率不高。如果枚举范围太大(一般以不超过2 000 000次为限),效率低的问题会在时间上难以承受。
算法思路
枚举算法一般按照如下3个步骤:
第一步:确定解题范围,枚举出所有可能的题解;
第二步:判断题解是否符合正解的条件;
第三步:使可能解的范围降至最小,以便提高解题效率。
**
案例分析【百钱买百鸡】
**
这是依据我国古代数学家张丘建在《算经》上的“百鸡问题”编写而成的。“百鸡问题”是一道闻名于世界的题目,很有价值,也很有趣味。题目的原文是:
“今鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。凡百钱买鸡百只,问:鸡翁、母、雏各几何?”
用通俗的话来说,题目的意思可以是:
用100文钱买来100只鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱3只。问:在这100只鸡中,公鸡、母鸡、小鸡各是多少只?
使用不定方程求解“百钱买百鸡”的问题,其解题如下:
解:设公鸡X只,母鸡Y只,小鸡Z只;得
枚举算法 - 依波路 - 依波路的博客
这里X、Y、Z为正整数,且Z是3的倍数;由于鸡和钱的总数都是100,可以确定X、Y、Z的取值范围。
X的取值范围为0~20(100÷5=20)
Y的取值范围为0~33(100÷3≈33)
Z的取值范围为0~99,步长为3
**
算法分析
**
使用枚举方法解决这样的问题,只需遍历x、y、z的所有可能组合,即得到问题的解。
数据要求
问题中的常量:无
问题的输入:无
**
具体实现代码如下
**
include “stdio.h”
main(){
int x,y,z;
for(x=0;x<=20;x++){
for(y=0;y<=33;y++){
z=100-x-y;
if((5*x+3*y+z/3==100)&&(x+y+z==100))
printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);}
}
}