枚举算法

1.枚举法的基本思想

根据实际问题设计多重循环,一一枚举所有可能的状态,并用问题给定的约束条件检验哪些状态是需要的,哪些状态是不需要的。能使命题成立的状态,即为其解。虽然枚举法本质上属于搜索策略,但是它与后面讲的回溯法或宽度优先搜索有所不同。

2.枚举条件

①可预先确定每个状态的元素个数n。如百钱买百鸡问题,3文钱一只鸡的状态元素个数可预先确定;

②可预先确定每个状态元素a1,a2,…,an的值域。

3.框架结构

设a11为状态元素ai的最小值;aik为状态元素ai的最大值(1<=i<=n),即状态元素a1,a2,…an的值域分别为a11<=a1<=a1k, a21<=a2<=a2k,……ai1<=ai<=aik,…
    an1<=an<=ank。
   for(a1=a11;a1<=a1k;a1++)
      for(a2=a21;a2<=a2k;a2++)
         .....
        for(ai=ai1;ai<=aik;ai++)
             .....
            for(an=an1;an<=ank;an++)
                 if(状态(a1,...,ai...,an)满足检验条件)输出问题的解;

4.优缺点

枚举法的优点:由于枚举算法一般是现实问题的“直译”,且是建立在考察大量状态、甚至是穷举所有状态的基础之上的,因此比较直观,易于理解,其算法的正确性也比较容易证明。
枚举法的缺点:枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较低。

时间: 2024-10-06 00:42:53

枚举算法的相关文章

枚举算法001

Hello!各位小伙伴们大家好,我是苦瓜,今天我来带大家一起进入算法的世界!我们先从枚举算法开始学习哦! 首先,我给大家普及一下枚举算法的基本概念,枚举算法就是将所有可能的结果进行逐个枚举尝试,进而找到适合条件的数据.说白一点就是利用多重 for 循环将所有的可能进行遍历,最后利用 if 判断语句将我们需要的结果筛选出来.下面,我们用一个简单demo来进行学习. 求100-1000之间的水仙花数(Narcissus). public class Narcissus { public static

【枚举算法Day1】20170529-2枚举算法专题练习

20170529-2枚举算法专题练习 青岛二中日期 序号 题目名称 输入文件名 输出文件名 时限 内存 算法 难度 分类 081113 1 最大矩形 rectangle.in rectangle.out 1s 256MB 枚举 1 02枚举 081031 2 回文 palin.in palin.out 1s 256MB 枚举.优化 1 02枚举 081008 3 问题的设置 problemsetter.in problemsetter.out 1s 256MB 排序+枚举 1 02枚举 0810

2017-9-16C#笔记(枚举算法,百元买鸡)

枚举算法: 百元买鸡 枚举算法的ì例子:问题如下:某3人有100元打算买100只鸡,其中公鸡为5元每只,母鸡为3元每只,小?鸡为3只1块钱,问可以买多少只公鸡,母鸡,小鸡? int x, y, z; for (x = 0; x <= 20; x++) for (y = 0; y <= 33; y++) for (z = 0; z <= 100; z++) if ((x + y + z == 100) && (5 * x + y * 3 + z / 3 == 100) &a

比较“笨”的枚举算法(一)

枚举即一一列举. 一.枚举算法的思想 将问题所有的可能答案一一列举,然后根据实际情况选择合适而丢弃不合适的.在c语言中,枚举算法一般使用while循环实现. 二.实例演练 (1)"百钱买百鸡"问题:鸡翁一,值钱五:鸡母一,值钱三:鸡雏三,值钱一.百钱买百鸡,问鸡翁.母.雏各几何? 代码实现: #include "stdio.h" int main() { int x, y, z; for (x = 0; x <= 20;x++) { for (y = 0; y

生理周期 枚举算法问题

趁着寒假抓紧自学C++..... 生理周期问题是比较简单的算法问题,运用到了  枚举  的思想. 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例 如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以 通常三个周期的高峰不会落在同一天.对于每个人,我们想知道何时三个高峰落在同一天. 对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不

【枚举算法Day1】20170529-2枚举算法专题练习 题解

1.OneMoreRectangle 一个矩形 ●如果任意枚举矩形坐标,显然不可行.数组太大,开不下!●我们注意到,如果我们放入了矩形,矩形周围并没有其它矩形,那么稍微移动这个矩形,不会改变答案.显然,一定存在一种方案,使得放入的矩形的边界与某些已知矩形边界重合.我们不妨规定,放入的矩形下边界必须与已知矩形重合.左边界必须与已知矩形重合. 所以就可以做了 1 type rec=record 2 x1,y1,x2,y2:longint; 3 end; 4 var n,x,y,i,j,k,ans,m

枚举算法——熄灯问题

枚举法练习: 题目: 有 一个由按钮组成的矩阵,其中每行有6个按钮,共5行.每个按钮的位置上有一盏灯.当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都 会改变一次.即,如果灯原来是点亮的,就会被熄灭:如果灯原来是熄灭的,则会被点亮.在矩阵角上的按钮改变3盏灯的状态:在矩阵边上的按钮改变4盏灯的状 态:其他的按钮改变5盏灯的状态. 在 上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变.对矩阵中的每盏灯设置一个初始状态.请你按按钮,直至每一盏等都熄灭.与一盏

517-coding #1 枚举算法

枚举的技巧(什么是枚举) 暴力? 模拟? for? dfs? bfs? ... 巧妙的枚举.(优化时间复杂度.统计区间的贡献) ... 暴力大家都会 ... 优化暴力... 变成正解. About DFS/BFS 二进制状态压缩表示. 折办搜索然后匹配累加贡献. A* IDA* 搜索 迭代加深的DFS... About 序列上的枚举 若答案具有单调性可考虑枚举一个端点,二分右端点,加上整一段对答案的贡献. 若答案具有单调性可考虑双指针,加上整一段对答案的贡献. ... Some Qestions

jszs 枚举算法

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <script> window.onload = function () { var oa = document.getElementsByTagName('a'); var oul = document.getElementById('ul1'); var