穷举法(枚举法)实例解析

生活中我们常常会遇到很多看似简单,却比较繁琐的问题。例如写出1000以内的素数集合,破解三位数密码的无数次尝试等比较繁琐的工作,但是计算机处理这类反反复复的作业,却比较轻松。

充分利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,这也就是我们所说的枚举法,或者叫做穷举法。

穷举法的运用确实比较广泛,但是我们要充分明确穷举法运用的实际条件:
1、循环条件;
2、穷举对象;
3、穷举算法

接下来,让我们进入实际例题中,充分明确穷举法的运用:
有蜘蛛、蜻蜓、蝉三种动物共有18只,共有腿118条,翅膀20对。问蜘蛛、蜻蜓、蝉三种动物各有多少只?(蜘蛛又8条腿;蜻蜓有6条腿,两对翅膀;蝉有6条腿,一对翅膀)

分析如下:
首先我们确定三种动物的实际数量,决定循环次数。对三种动物各进行一次循环,实现三次嵌套循环。其次,就是填充判断条件。

第一种方法:(根据动物的总数量)

(1)确定循环次数:

for(x=0;x<18;x++)  //蜘蛛的总数不能超过18只for(y=0;y<18;y++)  //蜻蜓的总数不能超过18只for(z=0;z<18;z++)  //蝉的总数不能超过18只

(2)循环嵌套:

for(x=0;x<18;x++)  //蜘蛛的总数不能超过18只for(y=0;y<18;y++)  //蜻蜓的总数不能超过18只for(z=0;z<18;z++)  //蝉的总数不能超过18只

(3)判断条件:

if((x+y+z)==18 && (8*x+6*y+6*z)==118 && (2*y+z)==20)

(4)总体代码如下:

#include<stdio.h>
void Count();
int main()
{Count();return 0;
}
void Count()
{int x,y,z;for(x=0;x<18;x++)  //蜘蛛的总数不能超过18只for(y=0;y<18;y++)  //蜻蜓的总数不能超过18只for(z=0;z<18;z++)  //蝉的总数不能超过18只{if((x+y+z)==18 && (8*x+6*y+6*z)==118 && (2*y+z)==20)  //判断条件{printf("x=%d,y=%d,z=%d\n",x,y,z);}}
}

(5)运行结果:

(6)结果分析:

从循环的分析,每一种的动物都进行了三次循环,极大地增加了时间复杂度。

第二种方法:(根据三种动物的总数,以及腿和翅膀的数量)

(1)确定循环次数

for(x=0;x<14;x++)  //蜘蛛的总数不能超过14只for(y=0;y<10;y++)  //蜻蜓的总数不能超过10只for(z=0;z<18;z++)  //蝉的总数不能超过18只

(2)判断条件

if((x+y+z)==18 && (8*x+6*y+6*z)==118 && (2*y+z)==20)

(3)总体代码如下:

#include<stdio.h>
void Count();
int main()
{Count();return 0;
}
void Count()
{int x,y,z;for(x=0;x<14;x++)  //蜘蛛的总数不能超过14只for(y=0;y<10;y++)  //蜻蜓的总数不能超过10只for(z=0;z<18;z++)  //蝉的总数不能超过18只{if((x+y+z)==18 && (8*x+6*y+6*z)==118 && (2*y+z)==20)  //判断条件{printf("x=%d,y=%d,z=%d\n",x,y,z);}}
}

(4)运行结果:

(5)结果分析:

从循环的分析,每一种的动物都进行了内外三次循环,但是第二种方法的循环次数有所减少,间接减少了时间的效率问题。

总结:

通过以上两种方法解决问题,我们知道这两种方法的效率明显不同。特别是第一种方法,时间的效率低于第二种方法。

穷举需要注意以下几个要点:

(1)循环次数分析
(2)判断条件要充分利用
(3)算法

穷举法(枚举法)实例解析相关推荐

  1. c语言穷举算法 枚举法,c语言枚举法(穷举法).ppt

    c语言枚举法(穷举法) 枚举法(穷举法) "笨人之法": 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. 百元买百鸡问题分析 百元买百鸡问题分析 优化 继续优化 利用 ...

  2. c语言穷举算法 枚举法,c语言枚举法 穷举法 ppt课件

    枚举法 穷举法 笨人之法 把所有可能的情况一一测试 筛选出符合条件的各种结果进行输出 分析 这是个不定方程 三元一次方程组问题 三个变量 两个方程 x y z 1005x 3y z 3 100设公鸡为 ...

  3. 【算法】蛮力法/穷举法/枚举法 的基本问题分析

    炮兵问题的优化,设立逻辑数组 蛮力法设计思想 有策略地穷举 + 验证 制定穷举策略 避免重复 简单来说,就是列举问题所有可能的解,然后去看看是否满足题目要求,是一种逆向解题方式.(我也不知道答案是什么 ...

  4. matlab穷举全排列,全排列:穷举法和递归法

    #include #include //2013-4-21 //n个数全排列 //使用穷举法实现 假设 n=3 的情况,根据n使用不同层的for循环 void Brute_Force_Full_Arr ...

  5. C++ 算法篇 穷举(枚举)

    穷举 计算机的特点之一就是运算速度快,善于重复做一件事."穷举"正是基于这一特点的最古老的算法.它一般是在一时找不出解决问题的更好途径,即从数学上找不到求解的公式或规则时,根据问题 ...

  6. 『ACM-算法-枚举法』信息竞赛进阶指南--枚举方法

    你以为枚举是一个一个的找? 还真是 你以为枚举都是for循环? 还真是 但你真的会枚举吗?组合型枚举,指数型枚举,排列型枚举?难道你只会线形枚举? 你可太菜了! // 递归实现指数型枚举 vector ...

  7. java穷举法解方程_枚举法(穷举法)_Java语言程

    枚举法(穷举法)_Java语言程 3.5.1 枚举法(穷举法) 枚举法就是把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. [例3-20] 百元买百鸡:用一百元钱买一百只鸡.已知公鸡5元/ ...

  8. 【算法】最直接的算法——穷举法详解

    第三章 穷举法 一.基本概念 穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环. 穷举法依赖的基本技 ...

  9. 网络安全渗透测试之burpsuite穷举

    穷举概述 穷举就是枚举的意思,在互联网的今天,需要使用某种的服务,大多数都需要口令登录,这个口令就是密码,密码的强度分为,弱口令 .中度口令.强度口令.如果登录的服务为弱口令,那会存在很大的安全隐患, ...

  10. 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找

    目录 蛮力法(brute force): [例4-1]链环数字对  问题分析  计算模型 pair_digital(int n): 代码: [例4-2]解数字迷: 思考题:ACM预测:​ 问题分析 ...

最新文章

  1. 2017-2018-2 20179204《网络攻防实践》第八周学习总结
  2. 工业用微型计算机(26)-伪操作(2)
  3. mysql数据的引用_MySQL数据库入门:mysql操作和程序引用
  4. Flume实操(一)【监控端口数据官方案例】
  5. Android开发之RadioButton选择改变字体颜色与背景色
  6. IronPython for ASP.NET:使用共享代码
  7. H - Color the ball(树状数组)(区间更新)(求单点)(线段树)
  8. WinForms时代结束,报表控件FastReport.NET开启FastReport.Core.Skia 时代!
  9. Win7窗口最大化和最小化快捷键
  10. 固定连接修改后无觅推荐结果问题修改
  11. 数据运营平台-基础架构
  12. android耗电怎么解决方法,Android手机媒体进程耗电严重怎么办
  13. iOS直播类APP开发流程解析
  14. 1_Qt的介绍和开始
  15. 强制弹窗被判刑,内因是“不知”还是“不愿”守法?
  16. VESTA的扩胞功能——超晶胞的建立
  17. 吹爆CSDN插件助手的细节功能(保姆级图文)
  18. RASPBERRY PI3 - RPi.GPIO 官方使用文档翻译
  19. java求圆的周长、面积
  20. 从一个案例谈故障模型

热门文章

  1. 集合(Collection)的详细笔记
  2. java Runtime.exec方法详解
  3. 防爆机器人布里茨还能买到吗_LOL防暴机器人 布里茨皮肤
  4. 联想y9000x做java_联想Y9000X装win7系统及BIOS设置教程(支持9代)
  5. 主题讲座:移动互联网时代的创业机会
  6. 【生信可视化】ChemDraw基础操作教程
  7. 【C++]参数的缺省值
  8. mybatis简单查询
  9. 新浪微博批量取消关注引发的思考
  10. 【有利可图网】PS教程:用滤镜打造3D立体文字效果