蓝桥杯 之 回溯之充分剪枝

文章目录

    • 买瓜
    • 最大数字

  • 在蓝桥杯当中,对于回溯是属于一个必考的问题,但是除了回溯的几个基本的问题,如果通过剪枝来提前删去无效的分支,以大大减少时间复杂度是需要我们进一步思考的问题!
  • 回溯的基本问题:
    • 回溯的初始状态
    • 回溯的状态转移
    • 回溯的结束状态
  • 其中,这个剪枝的考点就可以在结束状态部分进行充分的考察
  • 那么这个剪枝有哪些思路与思考?
    • 对于这个n个物体,求和的回溯问题:可以考虑使用前缀和,排序两个手段进行提前剪枝(以真题买瓜进行深入的分析)

买瓜

买瓜

在这里插入图片描述

  • 首先按照正常的回溯的思路:

    • 首先考虑在回溯的过程中,我们需要记录什么参数?
      • 由于要更新这个最终的切西瓜的刀数,所以得设置一个变量记录当前的切西瓜的刀数
      • 那么当前是切的哪一个西瓜?所以还得记录一下这个所处理的西瓜的下标
      • 那么怎么知道当前的得到的西瓜的重量?所以还得设置一个变量去记录当前所得到的西瓜
    • 总的来说,回溯的过程中,需要三个变量(i, k, cursum),分别表示当前处理到的西瓜的下标,当前已经切的西瓜刀数,当前得到的西瓜的重量
  • 考虑这个结束的状态与更新答案的状态

    • 结束的状态:当处理到的西瓜的下标达到n的时候,就返回(因为西瓜的下标是从0开始的,所以当处理到的西瓜的下标到达n就说明已经处理完了)
    • 更新的状态:当当前的重量等于目标重量的时候,就比较当前的切西瓜的次数与当前的切西瓜的最优次数,进行一个更新
  • 由于有除以2的操作,所以我们可以将这个目标都扩大两倍,同时将这个西瓜重量也扩大两倍,这样就不用除以2

# 对于每个西瓜,可以选择切与不切
n, m = map(int, input().split())
m = m<<1 
num = list(map(int, input().split()))
a = [i*2 for i in num]
ans = n+1
# 当前的瓜的下标,当前切的刀数,当前的重量
def dfs(i, k, cursum):global ansif cursum == m:ans = min(ans, k)if i == n:return# 不选dfs(i + 1, k, cursum)# 选择,如果当前的cursum 没有超过这个mif cursum + num[i] > m:return# 选择一整个西瓜dfs(i + 1, k, cursum + a[i])# 选择半个西瓜dfs(i + 1, k + 1, cursum + num[i])
dfs(0,0,0)
print(ans if ans != n+1 else -1)
  • 思考:剪枝不够充分,目前的剪枝是有对结束状态的判断,那么还有什么情况可以考虑?
    • 考虑及时加上全部的西瓜仍然<m,这个时候就没有必要递归下去了,直接结束(难道我们每次都得使用这个sum函数进行求解吗?当然不是,我们可以使用前缀和进行求解,但是为了方便起见,得将原始的数组和前缀和数组进行转置)
    • 如果当前的重量已经超过了这个 m就没有必要继续递归下去了
# 总的来说,m,n是输入
n,m = map(int,input().split())
m = m << 1
num = list(map(int,input().split()))
num.sort()
a = [i<<1 for i in num]
pre = [0]*n
pre[0] = a[0]
for i in range(1,n):pre[i] = pre[i-1] + a[i]
a = a[::-1]
pre = pre[::-1]
ans = n+1
def dfs(i,k,cursum):global ansif cursum == m :ans = min(ans,k)# if k >= ans:#     returnif i == n or cursum >= m or cursum + pre[i] < m:returndfs(i+1,k,cursum )dfs(i+1,k+1,cursum + a[i] // 2)dfs(i+1,k,cursum + a[i])dfs(0,0,0)
print(ans if ans != n+1 else -1)

最大数字

最大数字
在这里插入图片描述

  • 错误的递归思路:每次只要么处理一位操作1要么处理操作2,这样的处理思路是有问题的,你要么在位数i的时候,直接用完对应的操作1或者操作2,使其变为9,如果不能变为9,那么就尽可能大(操作2是有可能剩余的,但是操作1是不可能剩余的)
  • 包含一点贪心的思路
import os
import sys# 请在此输入您的代码# 肯定是按照这个数位进行操作的
N,A,B = map(int,input().split())
N = list(str(N))
n = len(N)
# 需要记录什么?操作1的次数,操作2的次数,当前操作的是哪一位?
ans = 0
def dfs(i,n1,n2,curnum):global ansif i == n:ans = max(ans,curnum)return # 先进行加法,看看能不能将该位变为9num = int(N[i])ad = min(n1,9-num)n1 -= ad dfs(i+1,n1,n2,curnum*10 + num + ad)n1 += ad # 进行减法if n2 > num:n2 = n2 - (num + 1)dfs(i+1,n1,n2,curnum*10 + 9)n2 = n2 + (num + 1)
dfs(0,A,B,0)
print(ans)

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

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

相关文章

【春招笔试】2025.03.13-蚂蚁春招笔试题

题目总结 题目一:区间未出现的最小值之和 1️⃣:统计全为1的子数组数量和全为0的子数组数量,利用公式计算 2️⃣:利用数学公式 n(n+1) - 2N0 - N1 计算最终答案 难度:中等 这道题目的关键在于理解 mex 的概念,并发现对于只含 0 和 1 的数组,mex 值只可能是 0、1 或 2。…

iOS 模块化架构设计:主流方案与实现详解

随着 iOS 工程规模的扩大&#xff0c;模块化设计成为提升代码可维护性、团队协作效率和开发灵活性的关键。本文将探讨为什么需要模块化&#xff0c;介绍四种主流的模块化架构方案&#xff08;协议抽象、依赖注入、路由机制和事件总线&#xff09;&#xff0c;并通过代码示例和对…

太速科技-636-基于FMC的Kintex XCKU060高性能PCIe载板

基于FMC的Kintex XCKU060高性能PCIe载板 一、板卡概述 板卡主控芯片采用Xilinx 公司的 Kintex UltraScale系列FPGA XCKU060-2FFVA1156。板载 2 组 64bit 的DDR4 SDRAM&#xff0c;每组容量2GB&#xff0c;可稳定运行在2400MT/s。支持PCIE Gen3 x8模式及一路FMC HPC接口。同…

【Spring Cloud】 核心组件全解析与 2024 【微服务框架】选型指南

《Spring Cloud 核心组件全解析与 2024 微服务框架选型指南》 第一部分&#xff1a;Spring Cloud 核心组件及功能速查表 组件名称核心功能一句话总结详细功能说明Eureka服务注册与发现的“通讯录”Server存储服务节点信息&#xff0c;Client自动注册和拉取列表&#xff0c;实现…

SAP SD学习笔记31 - 销售BOM

上一篇讲 前受金处理(预付款处理)。 SAP SD学习笔记29 - 前受金处理(预收款处理)_fplt 付款申请与sd 数据表的关联关系-CSDN博客 本章继续讲SAP SD模块的其他知识&#xff1a;销售BOM。 销售BOM在现场还是会用到的。 目录 1&#xff0c;销售BOM概要 2&#xff0c;受注BOM的…

动态路径规划——01背包问题讲解和通过滚动数组优化

如果没有动态路径规划基础的兄弟可以出去了&#xff0c;这个题目有两个问题 第一问讲解&#xff1a; 1.定义状态表示 刚开始我做的时候根据我的经验定义了一个状态表示dp[i]表示从1到i个物品中选择的最大价值&#xff0c;但是这个状态表示有一个明显的问题&#xff0c;我怎么知…

Java程序的逻辑控制

目录 1、顺序结构2、分支结构2.1、if 语句2.2、switch 语句 3、循环结构3.1、while 语句3.2、break3.3、continue3.4、for 循环3.5、do while 语句 1、顺序结构 顺序结构比较简单&#xff0c;按照代码书写的顺序一行一行执行。如果调整代码的书写顺序, 则执行顺序也发生变化。…

【鸿蒙开发】Hi3861学习笔记- GPIO之LED

00. 目录 文章目录 00. 目录01. GPIO概述02. 硬件设计03. 软件设计04. 实验现象05. 附录 01. GPIO概述 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GPIO管脚&#xff0c;每组GPIO有一个或多…

你的完美主义:从缺陷到超能力

所属专栏&#xff1a;《逻辑辨证系列》 前情回顾&#xff1a; 《完美还是完成》&#xff08;一&#xff09;&#xff1a;完成还是完美—完成大于完美 时间、机会、情绪成本 先完成 … 本期&#xff1a; 《完美还是完成》&#xff08;二&#xff09;&#xff1a;你的完美主…

438.找出字符串中所有字母异位词

题目&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba&q…

win32汇编环境,对话框程序中创建托盘示例一

;运行效果 ;win32汇编环境,对话框程序中创建托盘示例一 ;托盘&#xff0c;就是电脑桌面右下角那个角落里的图标&#xff0c;这里展示基本的应用方法。 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>…

Ansible相关工具:ansible-doc、ansible

文章目录 管理方式相关工具ansible-doc命令用法案例 ansibleansible主配置文件日志文件主机清单 ansible命令基本格式&#xff1a;选项说明&#xff1a;ansible的Host-pattern或关系逻辑与逻辑非正则表达式 ansible命令执行过程ansible 的执行状态 管理方式 利用ansible实现管…

LeetCode 热题 100_前 K 个高频元素(73_347_中等_C++)(堆)(哈希表+排序;哈希表+优先队列(小根堆))

LeetCode 热题 100_前 K 个高频元素&#xff08;73_347&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;哈希表排序&#xff09;&#xff1a;思路二&#xff08;哈希表优先队列&#xff08;小根堆&#xff0…

使用Python在Word中生成多种不同类型的图表

目录 工具与环境配置 在 Word 中创建图表的步骤 在Word中创建柱形图 在Word中创建条形图 在Word中创建折线图 在Word中创建饼图 在Word中创建散点图 在Word中创建气泡图 在 Word 文档中插入图表不仅能更直观地呈现数据&#xff0c;还能提升文档的可读性和专业性。常见的…

项目-个人博客测试报告

目录 一、项目背景 二、项目功能 三、测试计划 &#xff08;1&#xff09;功能测试 &#xff08;2&#xff09;自动化测试 &#xff08;3&#xff09;性能测试 一、项目背景 1、个人博客系统是一个操作简单的基于Spring前后端分离的项目&#xff0c;同时使用MySQL数据库来进…

前端npm包- CropperJS

文章目录 一、CropperJS**核心特性****官网与文档****安装与使用**1. **通过 npm/yarn/pnpm 安装**2. **HTML 结构**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相关插件/替代方案****适用场景****注意事项** 总结 一、CropperJS cropperjs 是一个轻量级、功能强大的 图片裁…

杨辉三角形(信息学奥赛一本通-2043)

【题目描述】 例5.11 打印杨辉三角形的前n(2≤n≤20)行。杨辉三角形如下图&#xff1a; 当n5时 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输出&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 【输入】 输入行数n。 【输出】 输出如题述三角形。n行&#…

图论入门【数据结构基础】:什么是图?如何表示图?

图&#xff08;Graph&#xff09; 是一种非线性数据结构&#xff0c;用于表示对象之间的关系。图由 顶点&#xff08;Vertex&#xff09; 和 边&#xff08;Edge&#xff09; 组成&#xff0c;其中顶点表示对象&#xff0c;边表示对象之间的关系。图广泛应用于计算机科学、数学…

如何使用HACS一键集成米家与果家设备到HomeAssistant玩转智能家居

文章目录 前言1. 下载HACS源码2. 添加HACS商店3. 绑定米家设备 前言 各位科技潮人和智能家居发烧友们&#xff0c;是不是也梦想着把家里变成一个高科技的空间&#xff1f;有了群晖NAS这位得力助手&#xff0c;不仅存储空间大得吓人&#xff0c;还能通过Docker轻松安装各种应用…

《Java对象“比武场“:Comparable与Comparator的巅峰对决》

目录 引言&#xff1a; 一、认识接口 1.1 Comparable 1.2 Comparator ​编辑 1.3 核心概念对比 二、代码实现对比 2.1 Comparable 实现示例 2.2 Comparator 实例示例 三、核心区别详解 3.1 设计理念差异 3.2 方法调用 3.3 使用情景 四、本质区别总结 引言&#x…