【算法】枚举算法

article/2025/8/23 14:50:37

目录

算法详述

例题

A - 火柴棒等式

B - 砝码称重

输入格式

输出格式


算法详述

枚举:即对可能的解集合一一列举。 

枚举算法的实现往往通过使用循环(嵌套)就能够轻易实现,所以并没有什么思维难度。

解题思路:

1. 对解的每个参数的数据范围采用循环语句一一枚举,对每次枚举采用if语句判断是否是解以及是否是最优解。

枚举小技巧:

1. 有时候,我们枚举的东西如果满足一个公式,我们的循环可以少写一层,优化效率。比如如果枚举A+B+C=100,我们只需要枚举A和B,C可以直接用100-A-B,这样就少一层循环。

2. 当然,改变枚举的顺序也是一种小技巧。一般都是从小到大或者从大到小,但是还有其他顺序,这就用到了贪心算法。

3. 有时候我们需要枚举的是每个东西的状态(一般为两种状态),我们可以用二进制里面的0/1来表示这两种状态来进行枚举。比如(二进制枚举)有5个小朋友,枚举他们是否看过该博客,这时候可以把看过或者没有看过表示两种状态,分别用0和1表示。现在给数字5,二进制是101,说明第1和第3个小朋友看过。所以我们可以枚举0~2^{5}-1(31)来表示5个小朋友每个小朋友之间的状态是什么。

4. 有时候,我们枚举的故率达不到题目所需,我们就可以将枚举出来的所有结果事先保存下来,然后在第二份程序里直接调用,这就是打表的思想。

5. 还有时候,简单的循环嵌套可能满足不了我们的需求,可以考虑递归算法实观。
 

例题

A - 火柴棒等式

给你 nn 根火柴棍,你可以拼出多少个形如 "A+B=C" 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。

用火柴棍拼数字 0-9,0−9 的拼法如图所示

注意:

  1. 加号与等号各自需要两根火柴棍

  2. 如果 A\neq B,则A+B=C与B+A=C 视为不同的等式(A、B、C ≥0)

  3. n 根火柴棍必须全部用上

输入格式

输入一个整数 n(n≤24)。

输出格式

输出能拼成的不同等式的数目。

Sample Input

5

 Sample Output

 0

分析:

(1)0~9所需要的火柴数:6,2,5,5,4,5,6,3,7,6 根火柴

(2)因为+=一共是4根,所以最后火柴数需要加上4

(3)因为1是所有数字中所用火柴数最少的数字,1111是四位数中最大的数,而且1111+1=1112此时一共25根>24,所以基本上不会到达四位数,因此最后循环到1000即可。由于担心某种特殊情况没有考虑到,可以将a数组放大到2000

(4)首先需要一个数组存放0~2000苏需要的火柴数,即数组a。然后求a[i]+a[j]+a[i+j]+4的火柴数,如果该数=n则让s加1并且继续循环,直到全部循环完成即可。

(5)其中11111问题的解析:关于《啊哈!算法》第三章火柴棍等式“1111”问题的解析_BDICOMENOW的博客-CSDN博客

代码 :

#include<iostream>
using namespace std;
int main()
{int a[2001] = { 6 }, n, c[10] = { 6,2,5,5,4,5,6,3,7,6 }, s = 0, i, j;//a数组表示下标所需要的火柴数,a[0]=6,其他的是0;n即输入的n的大小;其中c数组存储0~9数字所需要的火柴数cin >> n;for (i = 1; i <= 2000; i++)//因为1111是四位数用的最少的数,1111+1=1112此时就25根棍子了,所以基本上就不会实现四位数,但是把上界稍微放大了{j = i;while (j >= 1)//将数字进行十进制的拆分,将i所需要的火柴数放入a数组中{a[i] = a[i] + c[j % 10];j = j / 10;}}for (i = 0; i <= 1000; i++)//求出该等式所需要的火柴棍{for (j = 0; j <= 1000; j++)if (a[i] + a[j] + a[i + j] + 4 == n)//+4是因为+和=一共需要四根火柴棍s++;//s表示符合要求的答案数}cout << s;return 0;
}

B - 砝码称重

设有 1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重小于等于 1000),现在求问这些砝码能称出多少不同的重量。

输入格式

一行六个整数,分别代表 1g 砝码的个数,分别代表 2g砝码的个数,分别代表 3g 砝码的个数,分别代表 5g 砝码的个数,分别代表 10g 砝码的个数,分别代表 20g 砝码的个数。

输出格式

输出一行,格式为 Total=n。

(n 表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

Sample Input

1 1 0 0 0 0  

Sample Output 

Total=3

分析:

此题最好是可以用到枚举小技巧3,具体代码可见:(42条消息) B - 砝码称重_bairimeng16的博客-CSDN博客

代码: 

#include <iostream>
using namespace std;int main() {int h[1005] = { 0 }, cm[7];                                    // 9018最奇怪的一点,重量必须是1004以下,否则会WA for (int i = 1; i <= 6; i++) cin >> cm[i];for (int a = 0; a <= cm[1]; a++)                                // 枚举个数 for (int b = 0; b <= cm[2]; b++)for (int c = 0; c <= cm[3]; c++)for (int d = 0; d <= cm[4]; d++)for (int e = 0; e <= cm[5]; e++)for (int f = 0; f <= cm[6]; f++) {h[a + 2 * b + 3 * c + 5 * d + 10 * e + 20 * f] = 1;        // 重量桶 }int sum = 0;for (int i = 1; i <= 1004; i++) if (h[i]) sum++;cout << "Total=" << sum << endl;return 0;
}


http://chatgpt.dhexx.cn/article/jeJX9nEs.shtml

相关文章

基础算法(一):枚举算法

前言 从这篇文章开始&#xff0c;小荔枝就开始学习算法和数据结构啦&#xff01;&#xff01;&#xff01;我们先来看看入门的一些基础算法&#xff0c;在这篇文章中&#xff0c;主要介绍的是枚举算法。我们重点需要了解枚举算法使用时需要确定的条件&#xff0c;荔枝会用一道题…

常用算法——枚举算法

在进行归纳推理时&#xff0c;如果逐个考察了某类事件的所有可能情况&#xff0c;因而得出一般结论&#xff0c;那么这结论是可靠的&#xff0c;这种归纳方法叫做枚举算法 一、基本概念和算法 枚举算法简称枚举法&#xff0c;也称为列举法、穷举法&#xff0c;是暴力策略的具体…

枚举算法

一、枚举法的基本思想 枚举法又称穷举法。 基本思想是根据提出的问题枚举所有可能状态&#xff0c;并用问题给定的约束条件检验哪些状态是需要的&#xff0c;哪些状态是不需要的。 能使命题成立的状态&#xff0c;即为其解。 枚举结构&#xff1a;循环判断语句。 二、枚举…

传统人工势场法---经典算法

网上代码很多&#xff0c;这个可以直接使用。 Xo[0 0];%起点位置 k50;%计算引力需要的增益系数 K0;%初始化 m15;%计算斥力的增益系数&#xff0c;都是自己设定的。 Po0.5;%障碍影响距离&#xff0c;当障碍和车的距离大于这个距离时&#xff0c;斥力为0&#xff0c;即不受该障碍…

人工势场法(APF) —— Path Planning

版权声明&#xff1a;本文为博主原创博文&#xff0c;未经允许不得转载&#xff0c;若要转载&#xff0c;请说明出处并给出博文链接 维基百科说&#xff1a;“人工势场法&#xff08;Artificial Potential Field&#xff0c; APF&#xff09;是一种将机器人的外形视为势场中的一…

基于人工势场法的移动机器人路径规划研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 路径规划是移动机器人领域的热点研究方向&#xff0c;人工势场法已在工业机器人路径规划中得到广泛应用&#xff0c;近年来正逐…

11(0)-AirSim+四旋翼仿真-人工势场法避障

1.基本原理 人工势场法的基本原理为&#xff0c;根据地图内障碍物、目标点等的分布&#xff0c;构造一个人工势场&#xff0c;无人机由势能较高的位置向势能较低的位置移动。就好比是一个电场&#xff0c;电场内不同位置的电势能不同&#xff0c;对带电物体产生的力也不同&…

局部路径规划中的人工势场法

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 一、简介 如图所示&#xff0c;机器人在一个二维环境下运动&#xff0c;图中指出了机器人&#xff0c;障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#…

matlab箭头梯度方向场,局部路径规划算法——人工势场法

人工势场法是由Khatib于1986年提出,其方法是将移动机器人所处的环境用势场来定义,通过位置信息来控制机器人的避障行驶,基本思想是构造目标位姿引力场和障碍物周围斥力场共同作用的人工势场,搜索势函数的下降方向来寻找无碰撞路径。人工势场法避障技术使得机器人的移动能很…

基于人工势场法的车辆编队轨迹规划matlab仿真验证

给出了完整的MATLAB代码仿真&#xff1b;基于人工势场法编队的基本原理&#xff1a;通过构建车辆相对目标点的引力势场和斥力势场构建车辆所处地图下的整体势场&#xff0c;设置如图所示的势场图&#xff0c; 图中圆心为我们参考的目标点&#xff0c;其可以提供引力方向&#x…

基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工势场法原理是&#xff1a;首先构建一个人工虚拟势场&#xff0c;该势场由两部分组成&#xff0c;一部分是目标点对移动机器人产生的引力场&#xff0c;方向由机器人指向目标点&#xf…

matlab人工势场法三维演示图,运动规划入门 | 5. 白话人工势场法,从原理到Matlab实现...

如何利用人工势场进行运动规划? 1.1 引力势场(Attractive Potential Field) 人工势场这个特殊的势场并不是一个单一的场,其实它是由两个场叠加组合而成的,一个是引力场,一个是斥力场。 顾名思义引力势场是具有吸引的性质,会将机器人从起点处朝着终点处吸引,所以引力场的存…

路径规划算法3 改进的人工势场法(Matlab)

目录 传统人工势场 引力势场 斥力势场 合力势场 传统人工势场法存在的问题 改进的人工势场函数 Matlab代码实现 参考链接&#xff1a; [1]朱伟达. 基于改进型人工势场法的车辆避障路径规划研究[D]. 江苏大学, 2017. 1986年Khatib首先提出人工势场法&#xff0c;并将其应用在…

【控制】人工势场法及人工势场函数

目录 人工势场法-维基百科路径规划-人工势场法&#xff08;Artifical Potential Field&#xff09;引力场 (attractive/gravitation field)斥力场 (repulsive field)总场 【机器人路径规划】人工势场法PaperMatlab 代码自己编写的 Matlab1. 仅考虑引力的情况 人工势场法-维基百…

移动机器人路径规划:人工势场法

人工势场法是一种原理比较简单的移动机器人路径规划算法&#xff0c;它将目标点位置视做势能最低点&#xff0c;将地图中的障碍物视为势能高点&#xff0c;计算整个已知地图的势场图&#xff0c;然后理想情况下&#xff0c;机器人就像一个滚落的小球&#xff0c;自动避开各个障…

人工势场法matlab讲解_【机器人路径规划】人工势场法

阅读本文需要的基础知识为: 理解机器人的构型空间。建议阅读:机器人运动规划中的C space怎样理解?为什么不直接在笛卡尔坐标系下运算呢? 本文的实现程序与使用说明见我的学习工具箱:小明工坊:【个人开源】机器人运动规划学习工具箱使用说明 基本原理 1.概述 我们打两个比…

学习笔记:人工势场法

一、算法简介 1986年Khatib首先提出人工势场法&#xff0c;并将其应用在机器人避障领域&#xff0c;而现代汽车可以看作是一个高速行驶的机器人&#xff0c;所以该方法也可应用于汽车的避障路径规划领域。 二、算法思想 1、人工势场法的基本思想是在障碍物周围构建障碍物斥力…

人工势场法matlab讲解,传统人工势场法(matlab)

【实例简介】 人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动…

路径规划-人工势场法(Artifical Potential Field)

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 一、简介 如图所示&#xff0c;机器人在一个二维环境下运动&#xff0c;图中指出了机器人&#xff0c;障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#…

人工势场法

文章目录 前言一、人工势场法二、简要理解 1.示例2.代码总结 前言 路径规划是移动机器人领域的一个重要组成部分&#xff0c;传统的路径规划代表算法包括 A*算法、Dijkstra 算法、人工势场法以及仿生学的蚁群算法。人工势场法是机器人路径规划算法中一种简单有效的方法。人工势…