当前位置: 首页 > 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 提高组] 数的划分 - 洛谷

相关文章:

  • 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)
  • 多条跨境铁路加速推进,谁是下一个“超级枢纽”?
  • 俄官员说将适时宣布与乌克兰谈判代表
  • 广东省中医院脾胃病科大科主任张北平病逝,年仅52岁
  • 宝妈称宝宝在粽子中吃出带血创可贴,来伊份:已内部排查
  • 要更加冷静地看待“东升西降”的判断
  • 罕见沙尘再度入川,官方:沙尘传输高度达到平流层,远超以往