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

算法题(104):数的划分

审题:

本题需要我们找出将值为n的数分为k个数的和的所有组合,并打印

时间复杂度分析:数据个数为三位数级别,所以我们需要严格剪枝才可以使用dfs算法

思路:方法一:深度优先算法

搜索与剪枝策略:

搜索策略:一格格的进行数据插入,利用pos定插入位置,begin定开始插入的数字

如图所示:

剪枝1:我们看到圆圈1的位置,若第一个插入了2,第二个就不能插入1了,因为21_会和前面的12_情况重合,此时我们就需要剪掉这种等效冗余情况

剪枝2:我们看到圆圈2的位置,当我们遍历到3开头时,根据剪枝1,我们只能往后面插入大于等于之前的数据的数字,而即使后面的数都是3也已经总和大于6了,所以以3开头是不可能满足条件,直接剪枝这种情况即可

剪枝3:我们如果dfs进入了不满足剪枝2的情况后才进行判断会导致有额外的时间消耗,可能导致超时,所以我们要在进入不满足剪枝2的情况之前进行剪枝。

解题:

(1)main函数

(2)dfs

剪枝1:本质上就是只能往位置中插入大于等于前一个位置的数据的数字,体现在代码中就是从begin值开始插入

剪枝2与3:首先确定剪枝2的实现,我们的当前sum加上剩下的空格中都为i的值的总和大与n,说明此时最小总和都大于n。剪掉该情况,直接返回上一层dfs。

其次确定剪枝位置,不能是for循环外面,因为在外面剪枝是属于进入了该情况才剪枝,而我们是要实现在进入剪枝情况之前就剪枝,所以要在进入dfs前进行判断

P1025 [NOIP 2001 提高组] 数的划分 - 洛谷

http://www.dtcms.com/a/84639.html

相关文章:

  • Vue.js 应用的入口文件
  • STM32F103C8T6 -MINI核心板
  • C# SolidWorks 二次开发 -各种菜单命令增加方式
  • 建筑安全员考试:“知识拓展” 关键词驱动的深度备考攻略
  • 物理环境与安全
  • 说说Vue 3.0中Treeshaking特性?举例说明一下?
  • 多线程synchronized——线程“八锁”
  • 数据通信学习笔记之OSPF其他内容1
  • 精益架构设计:深入理解与实践 C# 中的单一职责原则
  • 单播、广播、组播和任播
  • 浔川社团官方联合会维权成功
  • 单一职责原则开闭原则其他开发原则
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(五) -> 添加/删除Module
  • MySql创建分区表并且按月分区
  • 数据库:一文掌握 Elasticsearch 的各种指令(Elasticsearch指令备忘)
  • 用户态内核态切换
  • 什么?获取到了未知的复位原因?
  • SOFABoot-07-版本查看
  • Linux系统管理与编程08:任务驱动综合应用
  • SAP SD学习笔记33 - 预詑品(寄售物料),预詑品引渡(KB),预詑品出库(KE)
  • S32k3XX MCU时钟配置
  • Gone v2 使用 goner/viper/remote链接远程的配置中心,支持etcd、consul、firestore、nats
  • 【Linux 下的 bash 无法正常解析, Windows 的 CRLF 换行符问题导致的】
  • 记忆力训练day24
  • C语言入门教程100讲(3)代码注释
  • 【免费】2000-2019年各省地方财政印花税数据
  • k8s--集群内的pod调用集群外的服务
  • 无法写入文件:(FileSystemError): Error: EPERM: operation not permitted, open...)
  • 【即插即用涨点模块】LSK大选择性核:自适应地捕捉遥感图像目标,实现暴力涨点【附源码+注释】
  • Android Compose 线性布局(Row、Column)源码深度剖析(十)