枚举算法

来源:互联网 发布:淘宝淘管家在哪里找到 编辑:程序博客网 时间:2024/05/19 06:51

**

算法定义

**
枚举算法(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);}           }}
0 0
原创粉丝点击