数据结构算法-穷举搜索算法

引言

穷举搜索是一种基本的搜索策略,其基本思想是逐一检查所有可能的解,直到找到一个有效的解或确定不存在解为止。在现实生活中,穷举搜索的应用非常广泛,以下是一些例子:

密码破解:在密码学中,穷举搜索是一种常见的攻击方法。攻击者尝试所有可能的密码组合,直到找到正确的密码。尽管这种方法可能会非常耗时,但对于一些简单的密码,穷举搜索可能是最有效的攻击方法。
解决数学问题:在数学中,有些问题可能需要通过穷举所有可能的选项来找到答案。例如,解决一些数论问题可能需要检查所有可能的因子或模形式。
旅行计划:在规划旅行路线时,我们可能会尝试所有可能的路线组合来找到最短或最快的路线。这实际上是一种穷举搜索,尽管现代的旅行规划软件通常使用更高效的算法来找到最优解。
决策树:在人工智能和机器学习中,穷举搜索可以用于构建决策树。决策树通过尝试所有可能的条件组合来做出决策。
编程调试:在编程中,当遇到错误时,程序员可能会尝试穷举所有可能的错误源和错误类型,以找到并解决问题。
游戏AI:在许多游戏中,AI可能会使用穷举搜索来找到最佳的移动或策略。例如,在国际象棋中,一个AI可能会尝试所有可能的走法,并评估它们的结果,以找到最优的走法。
规划日常生活:在日常生活中的许多情境下,我们可能会使用穷举搜索来规划我们的活动。例如,我们可能会尝试所有的时间安排选项,直到找到一个最优的时间表。

需要注意的是,虽然穷举搜索可以找到问题的解,但它通常只在问题的规模相对较小或有限的情况下才有效。

穷举搜索算法应用专区

有 20 枚硬币,可能包括 4 种类型:1 元、5 角、1 角和 5 分。
已知 20 枚硬币的总价值为 10 元,求各种硬币的数量。
例如:4、11、5、0 就是一种方案。而 8、2、10、 0 是另一个可能的方案,显然方案并不是
唯一的,请编写程序求出类似这样的不同的方案一共有多少种?

编程思路:
直接对四种类型的硬币的个数进行穷举。其中,1 元最多 10 枚、5 角最多 20 枚、1 角最多
20 枚、5 分最多 20 枚。

如果以元为单位,则 5 角、1 角、5 分会化成浮点型数据,容易计算出错。可以将 1
元、5 角、1 角、5 分变成 100 分、50 分、10 分和 5 分,从而全部采用整型数据处理。

#include<iostream>
using namespace std;int main(void) {// 声明四个整数变量,分别表示一元硬币的数量、五角硬币的数量、一角硬币的数量和五分硬币的数量  int Acoin100;//一元硬币数量  int Acoin50;//五角硬币数量  int Acoin10;//一角硬币数量  int Acoin5;//五分硬币数量  // 声明一个整数变量,用于计数满足条件的硬币组合数量  int count = 0;// 使用四个嵌套的for循环来遍历所有可能的硬币组合  for (Acoin100 = 0; Acoin100 <= 10; Acoin100++) {  // 一元硬币数量从0遍历到10  for (Acoin50 = 0; Acoin50 <= 20; Acoin50++) {  // 五角硬币数量从0遍历到20  for (Acoin10 = 0; Acoin10 <= 20; Acoin10++) {  // 一角硬币数量从0遍历到20  for (Acoin5 = 0; Acoin5 <= 20; Acoin5++) {  // 五分硬币数量从0遍历到20  //检查当前组合是否满足两个条件:总金额为10元和硬币总数为20枚  if ((Acoin100 * 100 + Acoin50 * 50 + Acoin10 * 10 + Acoin5 * 5) == 1000 && (Acoin100 + Acoin50 + Acoin10 + Acoin5) == 20) {// 如果满足条件,输出当前的硬币组合  cout << " 一元:" << Acoin100 << ",\t 伍角:" << Acoin50 << ",\t 一角:" << Acoin10 << " ,\t五分:" << Acoin5 << endl;// 增加计数器count的值  count++;}}}}}// 输出满足条件的硬币组合的数量  cout << endl << "一共有" << count << "种解决方案" << endl;return 0;
}

输出:

 一元:0,       伍角:20,      一角:0 ,     五分:0一元:4,       伍角:11,      一角:5 ,     五分:0一元:5,       伍角:9,       一角:4 ,     五分:2一元:6,       伍角:7,       一角:3 ,     五分:4一元:7,       伍角:5,       一角:2 ,     五分:6一元:8,       伍角:2,       一角:10 ,    五分:0一元:8,       伍角:3,       一角:1 ,     五分:8一元:9,       伍角:0,       一角:9 ,     五分:2一元:9,       伍角:1,       一角:0 ,     五分:10一共有9种解决方案

优化

#include<iostream>
using namespace std;int main(void) {// 声明四个整型变量,分别代表一元硬币、五角硬币、一角硬币和五分硬币的数量  int Acoin100; // 一元硬币数量  int Acoin50;  // 五角硬币数量  int Acoin10;  // 一角硬币数量  int Acoin5;   // 五分硬币数量  // 声明一个整型变量count,用于记录满足条件的硬币组合的数量  int count = 0;// 定义一个常量AcoinCount,表示硬币的总数  const int AcoinCount = 20;// 使用四个嵌套的for循环遍历所有可能的硬币组合  for (Acoin100 = 0; Acoin100 <= 10; Acoin100++) { // 一元硬币的数量从0到10  for (Acoin50 = 0; Acoin50 <= AcoinCount - Acoin100; Acoin50++) { // 五角硬币的数量从0到总硬币数减去已选择的一元硬币数量  for (Acoin10 = 0; Acoin10 <= AcoinCount - Acoin50; Acoin10++) { // 一角硬币的数量从0到总硬币数减去已选择的五角硬币数量  for (Acoin5 = 0; Acoin5 <= AcoinCount - Acoin10; Acoin5++) { // 五分硬币的数量从0到总硬币数减去已选择的一角硬币数量  // 检查当前组合是否满足总金额为10元和总硬币数为20的条件  if ((Acoin100 * 100 + Acoin50 * 50 + Acoin10 * 10 + Acoin5 * 5) == 1000 && (Acoin100 + Acoin50 + Acoin10 + Acoin5) == AcoinCount) {// 如果满足条件,输出当前的硬币组合并增加计数器  cout << " 一元:" << Acoin100 << ",\t 伍角:" << Acoin50 << ",\t 一角:" << Acoin10 << ",\t五分:" << Acoin5 << endl;count++;}}}}}// 输出满足条件的硬币组合的数量  cout << endl << "一共有" << count << "种解决方案" << endl;return 0;
}

穷举搜索核心思路

列举出所有可能的情况,逐个判断有哪些是符合问题所要求
的条件,从而得到问题的全部解答。
它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检
查,从中找出符合要求的答案。
用穷举算法解决问题,通常可以从两个方面进行分析:

  1. 问题所涉及的情况:问题所涉及的情况有哪些,情况的种数必须可以确定。把它描述
    出来。应用穷举时对问题所涉及的有限种情形必须一一列举,既不能重复,也不能遗漏。重复列
    举直接引发增解,影响解的准确性;而列举的遗漏可能导致问题解的遗漏。
  2. 答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。
    把这些条件描述出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…

HarmonyOS4.0系统性深入开发09卡片使用动效能力

卡片使用动效能力 ArkTS卡片开放了使用动画效果的能力&#xff0c;支持显式动画、属性动画、组件内转场能力。需要注意的是&#xff0c;ArkTS卡片使用动画效果时具有以下限制&#xff1a; 名称参数说明限制描述duration动画播放时长限制最长的动效播放时长为1秒&#xff0c;当…

【华为数据之道学习笔记】8-3异常数据监控

质量控制是通过监控质量形成过程&#xff0c;消除全过程中引起不合格或不满意效果的因素&#xff0c;以达到质量要求而采用的各种质量作业技术和活动。要保证最终交付质量&#xff0c;必须对过程进行质量控制&#xff0c;通常是在过程中设置关键质量控制点。例如&#xff0c;可…

Dockerfile学习文档

Dockerfile详解 Dockerfile是一个组合映像命令的文本&#xff1b;可以使用在命令行中调用任何命令&#xff1b;Docker通过dockerfile中的指令自动生成镜像。 通过docker build -t repository:tag ./ 即可构建&#xff0c;要求&#xff1a;./下存在Dockerfile文件 之前我们聊的…

SpringMVC源码解析——DispatcherServlet的逻辑处理

DispatcherServlet类相关的结构图如下&#xff1a; 其中jakarta.servlet.http.HttpServlet的父类是jakarta.servlet.GenericServlet&#xff0c;实现接口jakarta.servlet.Servlet。我们先看一下jakarta.servlet.Servlet接口的源码如下&#xff1a; /*** 定义所有servlet必须实…

PHP8的JIT(Just-In-Time)编译器是什么?

PHP8的JIT&#xff08;Just-In-Time&#xff09;编译器是什么&#xff1f; PHP8是最新的PHP版本&#xff0c;引入了JIT&#xff08;Just-In-Time&#xff09;编译器&#xff0c;以进一步提高性能和执行速度。 JIT编译器是一种在运行时将解释性语言转化为机器码的技术。在过去…

【网络安全】网络隔离设备

一、网络和终端隔离产品 网络和终端隔离产品分为终端隔离产品和网络隔离产品两大类。终端隔离产品一般指隔离卡或者隔离计算机。网络隔离产品根据产品形态和功能上的不同&#xff0c;该类产品可以分为协议转换产品、网闸和网络单向导入产品三种。 图1为终端隔离产品的一个典型…

2022-2023年度广东省职业院校学生专业技能大赛“软件测试”赛项性能测试题目-Jmeter

性能测试-JM 1、脚本添加: 脚本文件名称:SuppAndComp,测试计划名称:SuppAndComp。测试计划下添加两个线程组: (1)线程组一操作内容:系统管理员登录、进行新增供应商操作。 线程组名称SuppAdd。具体要求如下: 登录操作存放到仅一次控制器中,供应商名称前4位为固定…

dash 中的模式匹配回调函数Pattern-Matching Callbacks 8

模式匹配 模式匹配回调选择器 MATCH、ALL 和 ALLSMALLER 允许您编写可以响应或更新任意或动态数量组件的回调函数。 此示例呈现任意数量的 dcc. Dropdown 元素&#xff0c;并且只要任何 dcc. Dropdown 元素发生更改&#xff0c;就会触发回调。尝试添加几个下拉菜单并选择它们的…

Grafana增加仪表盘

1.Grafana介绍 grafana 是一款采用Go语言编写的开源应用&#xff0c;主要用于大规模指标数据的可视化展现&#xff0c;是网络架构和应用分析中最流行的时序数据展示工具&#xff0c;目前已经支持绝大部分常用的时序数据库。 Grafana下载地址&#xff1a;https://grafana.com/g…

burpsuite的安装与介绍

安装(挑一个你喜欢的版本安装就行) 编程环境安装指南:Java、Python 和 Burp Suite抓包工具_burpsuite和java-CSDN博客 简介 Burp Suite是一个用于攻击Web应用程序的集成平台。它集成了多种渗透测试组件,能够帮助我们更好地完成对Web应用的渗透测试和攻击,无论是自动化还…

基于CNN神经网络的手写字符识别实验报告

作业要求 具体实验内容根据实际情况自拟&#xff0c;可以是传统的BP神经网络&#xff0c;Hopfield神经网络&#xff0c;也可以是深度学习相关内容。 数据集自选&#xff0c;可以是自建数据集&#xff0c;或MNIST&#xff0c;CIFAR10等公开数据集。 实验报告内容包括但不限于&am…

nodejs+vue+微信小程序+python+PHP的会议管理系统-计算机毕业设计推荐

会议管理系统可以为公司领导提供会议记录管理功能&#xff0c;公司领导也就是系统的管理员&#xff0c;具有员工管理、公告管理、会议室管理、会议资料管理、会议投票管理、意见收集管理等管理的权限&#xff0c;添加或者删除用户基本信息。管理员需要先进行登录&#xff0c;获…

[C#]opencvsharp进行图像拼接普通拼接stitch算法拼接

介绍&#xff1a; opencvsharp进行图像拼一般有2种方式&#xff1a;一种是传统方法将2个图片上下或者左右拼接&#xff0c;还有一个方法就是融合拼接&#xff0c;stitch拼接就是一种非常好的算法。opencv里面已经有stitch拼接算法因此我们很容易进行拼接。 效果&#xff1a; …

PayPal账户被封是因为什么?如何解决?

Paypal作为跨境出海玩家最常用的付款工具之一&#xff0c;同时也是最容易出现冻结封号现象。保障PP账号安全非常重要&#xff0c;只有支付渠道安全&#xff0c;才不会“白费力气”&#xff0c;那么最重要的就是要了解它的封号原因以做好规避。 一、Paypal账号被封原因 1、账号…

FreeRTOS列表与列表项相关知识总结以及列表项的插入与删除实战

1.列表与列表项概念及结构体介绍 1.1列表项简介 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表 1.2 列表、列表项、迷你列表项结构体 1&#xff09;列表结构体 typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VAL…

List常见方法和遍历操作

List集合的特点 有序&#xff1a; 存和取的元素顺序一致有索引&#xff1a;可以通过索引操作元素可重复&#xff1a;存储的元素可以重复 List集合的特有方法 Collection的方法List都继承了List集合因为有索引&#xff0c;所以有了很多操作索引的方法 ublic static void main…

SpringBoot如何优雅的处理免登录接口

在项目开发过程中&#xff0c;会有很多API接口不需要登录就能直接访问&#xff0c;比如公开数据查询之类的 ~ 常规处理方法基本是 使用拦截器或过滤器&#xff0c;拦截需要认证的请求路径。在拦截器中判断session或token信息&#xff0c;如果存在则放行&#xff0c;否则跳转到…

挑战 ChatGPT 和 Google Bard 的防御

到目前为止&#xff0c;科学家已经创建了基于人工智能的聊天机器人&#xff0c;可以帮助内容生成。我们还看到人工智能被用来创建像 WormGPT 这样的恶意软件&#xff0c;尽管地下社区对此并不满意。但现在正在创建聊天机器人&#xff0c;可以使用生成人工智能通过即时注入活动来…