穷举法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。

采用枚举算法解题的基本思路:
(1)    确定枚举对象、枚举范围和判定条件;
(2)    一一枚举可能的解,验证是否是问题的解
下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题。
例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?
算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。
下面是解这个百鸡问题的程序

 

上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序:

 

程序循环了1013 次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次 ,时间复杂度为O(n2)。从上面的对比可以看出,对于枚举算法,加强约束条件,缩小枚举的范围,是程序优化的主要考虑方向。

例2、将1,2...9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数.
例如:三个三位数192,384,576满足以上条件.(NOIP1998pj)
算法分析:这是1998年全国分区联赛普及组试题(简称NOIP1998pj,以下同)。此题数据规模不大,可以进行枚举,如果我们不加思地以每一个数位为枚举对象,一位一位地去枚举:
for a:=1 to 9 do
for b:=1 to 9 do
………
for i:=1 to 9  do
这样下去,枚举次数就有99次,如果我们分别设三个数为x,2x,3x,以x为枚举对象,穷举的范围就减少为93,在细节上再进一步优化,枚举范围就更少了。程序如下:
var
  t,x:integer;
  s,st:string;
  c:char;
begin
  for x:=123 to 321 do{枚举所有可能的解}
  begin
    t:=0;
    str(x,st);{把整数x转化为字符串,存放在st中}
    str(x*2,s); st:=st+s;
    str(x*3,s); st:=st+s;
    for c:='1' to '9' do{枚举9个字符,判断是否都在st中}
      if pos(c,st)<>0 then inc(t) else break;{如果不在st中,则退出循环}
      if t=9 then   writeln(x,' ',x*2,' ',x*3);
  end;
end.

本文转自:http://blog.chinaunix.net/u/18135/showart_173867.html
算法思想—枚举、递推、迭代、递归、分治、贪心、动态规划、回溯、模拟、分支定界 阅读详情

相关推荐

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

穷举法在c\c++编程上的实际运用 生活中我们常常会遇到很多看似简单,却比较繁琐的问题。例如写出1000以内的素数集合,破解三位数密码的无数次尝试等比较繁琐的工作,但是计算机处理这类反反复复的作业,却比较轻松。 充分利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,这也就是我们所说的枚举法,或者叫做穷举法穷举法的运用确实比较广泛,但是我们要充分明确穷举法运用的实际条件: 1、循环条件; 2、穷举对象; 3、穷举算法 接下来,让我们进入实际例题中

qq_44831918的博客 1万+

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

穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环。穷举法以来的基本技术是遍历,也就是采用一定策略依次处理待求解问题的所有元素。对于穷举法自身的优化,一般只能减少其执行的系数,但是数量级不会改变。下列是一个经典穷举问题:我们知道,假设有i张10元,j张5元,k张1元,那么满足兑换方案的方程应该是ijk50并且i∗10j∗5k100。而10元最多5张,5元最多10张,1元最多50张。

weixin_45434953的博客 2万+

常见算法思想——穷举法

这篇文章介绍了穷举算法

qq_45902301的博客 1万+

枚举法(穷举法

枚举法

ssssssyyyysss的博客 2111

算法学习-暴力破解!枚举法(穷举法

暴力破解最常用的就是枚举法,也叫穷举法。这是我在刚接触算法的时候,用的最顺手的、也是最爱用的方法哈哈哈,我把他叫做“暴力递归”。枚举法(穷举法)    枚举法是在分析问题时,逐个列举出所有可能情况,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃,最后得出一般结论。主要利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是...

milkign的博客 2万+

穷举法习题练习

c语言练习 给出一个数字,要求: 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字 c语言练习 给出一个数字,要求: 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字 ...

yusheng19的博客 4344

算法设计思想(1)— 穷举法

1. 穷举法概念 穷举法又称穷举搜索法,是一种在问题域的解空间中对所有可能的解穷举搜索,并根据条件选择最优解的方法的总称。 数学上也把穷举法称为枚举法,就是在一个由有限个元素构成的集合中,把所有元素一一枚举研究的方法。 穷举法一般用来找出符合条件的所有解,但是如果给出最优解的判断条件,穷举法也可以用于求解最优解问题。 2. 设计思路 使用穷举法解决问题,基本上就是以下两个步骤: 确定问题的解(或...

wohu1104的专栏 1万+

算法详解——穷举法

穷举法是一种基本的算法思想,其核心在于遍历解空间中的所有可能解,逐一检验以确定哪些解符合问题的要求。这种方法不依赖于特定的策略或技巧,而是直接对所有可能的情况进行全面和系统的探索,以确保找到问题的确切答案。穷举法可用于解决多种类型的问题,特别是那些解空间有限且易于定义所有可能解的问题。以下是一些典型的问题类型,它们常常使用穷举法来寻找解决方案:组合问题:例如,旅行商问题(TSP),在这类问题中需要找出所有可能的组合或排列,然后选择最优解。尽管穷举法并不总是实际可行的,但它在解空间较小的情况下仍然有效。

python_plus的博客 3255

C语言穷举法的例子

qq_59213575的博客 3116

C++ 穷举法

今天我们来了解一下C++语言中,解决问题的一个较为常用的方法——穷举法。我们先来了解一下它的基本原理,再来做一些题目巩固一下。 穷举又叫枚举,就是先确立一个范围,再把这个范围里的数,一个一个的带入题目中尝试。如果符合题目中的所有条件,那么这道题就解出来了。 说白了——就是一个一个试。 打个比方吧!假如说我们要解出20-3等于多少(这个谁都会,我只是借助这个来帮助大家更好地理解穷举法)。首先被减数是20,所以这个答案不可能超过20,这个数最小是一,也

qq_73262353的博客 2286

穷举法破解密码-方法详解

生成一个长度是3的随机字符串,把这个字符串作为当做密码 使用穷举法生成长度是3个字符串,匹配上述生成的密码 要求: 分别使用多层for循环 和 递归解决上述问题 1.穷举法: 穷举算法,依赖计算机强大的计算能力,来穷举每一种可能的情况,以达到解决问题的目的,也叫枚举法、暴力破解法。 基本思想———逐一列举问题所涉及的所有情形,并根据问题提出的条件进行检验从而找到可能的解 。 方法步骤———确定枚举对象、枚举范围、判断条件;循环验证每一个解 2.递归: 递归的思想: 以此类推是递归的基本思想。 具..

Chenaniah coder 1万+

穷举法定义及示例

定义 穷举法算法设计中经常使用的一种方法,基本思想是问题的要求将问题的所有可能的输入一一进行验证,看是否满足问题的条件,从而找到可能的解。问题解有三种情况:有多个解,单个解或无解。穷举法又名枚举法,暴力破解法等。 使用数学进行表示如下: Y=F(X)∈Rwhere,&MediumSpace;X∈D.\quad \quad Y=\mathrm{F}(X) \in \mathbb{R} \m...

郝伟老师的博客——大数据、并行计算与人工智能时代 8455

C/C++程序设计常用算法——穷举法

穷举法是对众多候选答案按照一定顺序逐一验证,最终得出正确答案的过程。其中心思想就是:首先根据问题的部分条件预估答案的范围,然后在此范围内对所有可能的情况逐一验证,直到全部问题均通过了验证为止,而满足所有问题候选答案就是最终的答案。

Aliven888的博客 4780

C语言穷举法

使用C语言穷举法解决求总值问题。 1、一只猴子采摘了一堆苹果,第一天吃一半的苹果,猴子觉得还不够,于是再吃了一个。第二天也是这样。一直到吃了九天,第十天就只剩下一个了。请问猴子一共采摘了多少苹果。 分析:解决此类问题有两个方法。一种就是我们较为容易想到的逆推法。还有一种就是穷举法。 逆推法: #include int main(){ //第十天的苹果个数 int peach

u012806757的博客 2万+
上一篇: 迭代算法与递归算法
下一篇: _TrackMouseEvent的用法
FlowShell
博客等级 码龄17年 119粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值