当前位置: 首页 > news >正文

C++ dfs搜索枚举(四十八)【第八篇】

曾经我们讲过枚举算法,那假设我们把枚举算法应用到搜索里呢?

1.搜索枚举

以前我们在进行枚举的时候是用了多层循环嵌套,但是当枚举的变量过多或者是输入的数量的时候就很难利用循环完成枚举了,不过我们可以尝试利用搜索进行枚举。

通常,我们通过一个 dfs 函数来完成搜索枚举,而通过参数表示当前状态。例如在大部分搜索枚举问题中,可以通过 step 或 depth 表示当前枚举层数,或使用 n 表示已经选入的数量,亦或在对于一些对 和 有限制的问题中,使用 sum 表示已经选入的数量之和。

让我们看一道能够使用搜索枚举实现的题目:现有方程a[1]x[1]+a[2]x[2]+a[3]x[3]+...+a[n]x[n]=0 2≤n≤10,−5≤a[i]≤5,−2≤x[i]≤2,x[i]∈Z

求解的总数。

Z 表示整数集合,其包括了:全体正整数、全体负整数和零。

能够估算所有的状态总数在 10的5次方∼10的7次方,能够枚举全部的状态。虽然能够使用 10 个循环完成,但此处使用搜索枚举更为方便。

int ans = 0;
void dfs(int dep, int sum) {if (dep == n) {if (sum == 0){ans++;}return;}for (int i = -2; i <= 2; i++) {dfs(dep + 1, sum + a[dep] * i);}
}

在很多搜索枚举的问题中,会要求我们打印解的具体内容,那么可使用数组来保存具体的解。如对于之前求方程解的问题,可将代码修改为:

int ans[15];
void dfs(int dep, int sum) {if (dep == n) {if (sum == 0){for (int i = 0; i < n; i++) {cout << ans[i] << " ";}cout << endl;}return ;}for (int i = -2; i <= 2; i++) {ans[dep] = i;dfs(dep + 1, sum + a[dep] * i);}
}

把在dep这一层选择的情况放在ans[dep]位置,ans数组就记下了目前枚举到的情况。n

在搜索枚举的过程中,我们能够根据题目的一些性质,对求解的过程进行剪枝优化,这个我们以后也会学到。但是对大部分题目来说,搜索枚举很有可能达到状态的上限,所以很有必要在决定使用搜索枚举之前确定状态的总数。

http://www.lryc.cn/news/295168.html

相关文章:

  • 【优先级队列(大顶堆 小顶堆)】【遍历哈希表键值对】Leetcode 347 前K个高频元素
  • Java设计模式-模板方法模式(14)
  • 【C++ 二维前缀和】约会
  • 基于Springboot的社区疫情防控平台
  • JAVA中的类方法
  • rust嵌入式开发之RTICvsEmbassy
  • Bug地狱 #1 突然宕机,企业级应用到底怎么了
  • 使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队
  • 探索C语言结构体:编程中的利器与艺术
  • Git介绍与常用命令总结
  • 机器学习 | 探索朴素贝叶斯算法的应用
  • 【无刷电机学习】电流采样电路硬件方案
  • 对于协同过滤算法我自己的一些总结和看法
  • 数据库管理phpmyadmin
  • Oracle数据表ID自增操作
  • npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher
  • 第2节、让电机转起来【51单片机+L298N步进电机系列教程】
  • 1154: 第多少天
  • 【C语言初阶-const作用详解】const修饰变量、const修饰指针(图文详解版)
  • 线程协作工具类【CountDownLatch倒数门闩、Semaphore信号量、CyclicBarrier循环栏栅、Condition接口】
  • Python 函数式编程进阶:map、filter、reduce
  • 大模型|基础_word2vec
  • 14.2 url后端过滤器(❤❤)
  • Leetcode 377 组合总和 Ⅳ
  • CleanMyMacX4.14.6如何清理mac垃圾内存
  • Java 学习和实践笔记(1)
  • 【自然语言处理-工具篇】spaCy<1>--介绍及安装指南
  • LeetCode树总结
  • AI专题:冬渐去、春将来,待看,AI 开花,数据挂果,可控链潮起
  • Netty源码系列 之 EventLoop run()方法 源码