小马搬运物品-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第89讲。

小马搬运物品,本题是2022年4月23日举办的第13届蓝桥杯青少组Python编程省赛真题编程部分第4题,13届一共举办了两次省赛,这是第二次省赛。题目要求编程计算小马将N件物品从河的一岸搬运到河的另一岸一共有多少种方案。

先来看看题目的要求吧。

一.题目说明

时间限制:3000MS

内存限制:589824K8

编程实现:

小马需要将N件物品从河的一岸搬运到河的另一岸,每次搬运的物品为1到3件。请问小马将N件物品全部搬运过去有多少种方案。

例如:N = 3,将3件物品全部搬运过去有4种方案:

方案一:第一次搬运1件,第二次搬运1件,第三次搬运1件;

方案二:第一次搬运1件,第二次搬运2件;

方案三:第一次搬运2件,第二次搬运1件;

方案四:一次搬运3件。

输入描述:

输入一个正整数N,表示需要搬运的物品数

输出描述:

输出将N件物品全部搬运过去有多少种方案

样例输入:

3

样例输出:

4

评分标准:

  • 10分:能正确输出一组数据;

  • 10分:能正确输出两组数据;

  • 20分:能正确输出三组数据;

  • 20分:能正确输出四组数据。

二.思路分析

这是一道经典的算法题,涉及的知识点包括循环、条件、列表、递归、动态规划等。

看完题目描述,你脑海里首先想到的是什么呢?

如果你想到的是斐波那契数列,那么恭喜你,这道题基本上就可以拿下了。

图片

实际上,这是斐波那契数列的变种问题。

对于经典的斐波那契数列来说,每一项(第1项和第2项除外)都只和前面的两项有关系,即:

f(n) = f(n - 1) + f(n - 2)

本题中小马的搬运方案,每一项(前面3项除外)都和前面的三项有关系,如下:

f(n) = f(n - 1) + f(n - 2) + f(n - 3)

这是怎么推导出来的呢?

对于这种具有递推性质的问题,通常只需要考虑最后一步是如何计算的,就可以迅速的确定推导公式。

我们使用f(n)表示搬运n件物品的方案数量,最后一次到底搬运几件物品呢?

可以分3种情况讨论:

  • 搬运3件物品,那么搬运n - 3件物品的方案数为f(n - 3);

  • 搬运2件物品,那么搬运n - 2件物品的方案数为f(n - 2);

  • 搬运1件物品,那么搬运n - 1件物品的方案数为f(n - 1);

根据加法原理,当完成一件事情有n种不同的方式,且这些方式之间互不影响,那么完成这件事情的总方法数就是各类方式中的方法数之和。

因此,总的方案数量f(n)就等于f(n - 1) + f(n - 2) + f(n - 3)。

对于斐波那契数列及其变种这类问题,通常有如下三种解决方案:

  • 递归算法

  • 动态规划

  • 递推算法

不管使用哪一种思路,都需要单独考虑边界问题,对于本题而言,需要考虑前3项。

如果只有一件物品,毫无疑问只有一种方法,即f(1) = 1。

如果有两件物品,可以一次搬运两件,也可以分两次,每次搬运一件,所以一共有两种方案,即f(2) = 2。

如果有三件物品,可以每次搬运一件,分3次搬运,也可以一次搬运3件,还可以第一次搬运1件,第二次搬运2件,又或者是第一次搬运2件,第二次搬运1件,一共有4种方案,即f(3) = 4。 

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们分别使用3种方案来编写程序:

  • 递归算法

  • 动态规划

  • 递推算法

1. 递归算法

递归算法的重点是定义递归函数,代码如下:

图片

代码比较简单,但是随着n的增加,代码运行的时间会越来越长,效率会急剧下降。

其原因在于存在大量重复的计算,可以增加一个备忘录将每一次的计算结果保存起来,避免重复计算。

使用带备忘录的递归代码如下:

图片

代码不多,强调一点,这里的memo列表就是备忘录,前3项不需要保存,从第4项开始保存,对应于memo[4]。

有了备忘录,算法效率大大提高。

2. 动态规划

这里的推导公式(状态转移方程)和初始状态都已经确定好了,代码就比较简单了,如下:

图片

代码并不多,说明4点:

1). 这里定义函数f(n)用于计算搬运n件物品的方案数量,主要是为了方便处理边界条件,但它不是递归函数;

2). Python支持多变量赋值运算,因此可以直接写成dp[1], dp[2], dp[3] = 1, 2, 4,代码看起来更加紧凑;

3). 在循环计算的时候,从第4项开始,所以range()函数的起点是4;

4). dp列表的最后一项就是要计算的方案数量,可以使用dp[n]获取,也可以使用dp[-1]获取。

3. 递推算法

针对上面的动态规划算法,仔细想一想,每一项只和前3项有关,是不是只要保存这3项就可以了呢?

答案是肯定的,只需要4个变量就够了,1个表示当前项,另外3个用来保存前3项,从而节省了一个列表,这就是递推的写法,也叫迭代,代码如下:

图片

代码不难,强调一点,由于每一次都需要保存最后3项,需要不断更新f1,f2,f3的值,这就是f1, f2, f3 = f2, f3, f4的作用。

至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。

四.总结与思考

本题代码在14行左右,涉及到的知识点包括:

  • 循环语句;

  • 条件语句;

  • 列表;

  • 递归算法;

  • 动态规划函数;

  • 递推算法;

本题分值为60分,难度中等。关键点有两个,一是找到搬运物品方案的规律,确定好推导公式,二是使用多种算法来实现。

在找规律确定推到公式的问题时,一定要学会运用递归思维,将问题简化为两个步骤。最后一步保留,最后一步之前的所有步骤当作一步,然后看最后一步是如何计算出来的。切不可小瞧了这一点,在编程中,有很多问题都可以使用这一思维来解决。

本教程讲解了3种解决方案,这3种方案绝不是孤立的,它们之间都有一个共同的观点,这就是推导公式。

实际上,凡是有推导公式的问题,基本上可以采用这3种算法,尤其是带备忘录的递归和动态规划。如果说递归是自顶向下的推导过程,那么动态规划就是自底向上的推导过程。

和斐波那契数列相关的题目在历届真题中多次出现,如下:

  • 《病毒繁殖-第12届蓝桥杯选拔赛Python真题精选》

  • 《密室逃脱游戏-第12届蓝桥杯省赛Python真题精选》

  • 《跳房子游戏-第13届蓝桥杯选拔赛Python真题精选》

你可以放在一起来分析对比,以加深理解。

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#/.NET量化开发实现财富自由【4】实现EMA、MACD技术指标的计算

听说大A又回到了2950点以下,对于量化交易来说,可能这些都不是事儿。例如,你可以预判到大A到顶了,你可能早就跑路了。判断逃顶还是抄底,最简单的方式就是判断是否顶背离还是底背离,例如通过MACD,…

华为5288 V5服务器安装BCLinux8U4手记

本文记录了华为5288 V5服务器安装BCLinux8U4操作系统的过程。 一、系统环境 1、服务器 华为FusionServer Pro 5288 V5服务器 2、操作系统 BCLinux-R8-U4-Server-x86_64-220725.iso 官网下载地址 sha256sum:1d31d3b8e02279e89965bd3bea61f14c65b9d32ad2ab6d4eb…

MySQL数据库基础练习系列——教务管理系统

项目名称与项目简介 教务管理系统是一个旨在帮助学校或教育机构管理教务活动的软件系统。它涵盖了学生信息管理、教师信息管理、课程管理、成绩管理以及相关的报表生成等功能。通过该系统,学校可以更加高效地处理教务数据,提升教学质量和管理水平。 1.…

uniapp获取证书秘钥、Android App备案获取公钥、签名MD5值

一、 uniapp获取证书秘钥 打开uniapp开发者中心下载证书打开cmd输入以下这段代码,下载提供查看到的密钥证书密码就可以了!下载证书在 java 环境下运行才可以 // your_alias 换成 证书详情中的别名,your_keystore.keystore 改成自己的证书文件…

炸裂行情,只涨指数难涨票!你的股票涨了吗?

今天的A股,让人愣住了,你知道是为什么吗?盘面上出现2个耐人寻味的重要信号,一起来看看: 1、今天A股冲高回落,很多人愣住了,别慌!主力增量在不断增加,7月的一波主线反弹正…

小程序web-view无法打开该页面的解决方法

问题:开发者工具可以正常打开,正式上线版小程序使用 web-view 组件测试时提示:“无法打开该页面,不支持打开 https://xxxxxx,请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 解决方法:需要配…

计网实训——不相同网段的PC相互通信

目录 提前准备APP路由器指令 实验一1、实验需求(1)实现同网段的PC相互通信。(2)实现不相同网段的PC相互通信。(3)分析相同和不同网段PC通信时MAC地址的变化。 2、实验拓扑3、实验步骤及实验截图&#xff08…

金顺心贸易有限公司简介

金顺心贸易有限公司成立于2015年,注册地位于风景如画的广西壮族自治区防城港市东兴市。 金顺心贸易如他们的名字一样,有着实实在在的业绩和口碑的。他们专注于国际贸易,主营越南进口食品:果汁饮料、春卷皮、调味品、汤底、米粉、…

【LeetCode】九、双指针算法:环形链表检测 + 救生艇

文章目录 1、双指针算法1.1 对撞双指针1.2 快慢双指针 2、leetcode141:环形链表3、leetcode881:救生艇 1、双指针算法 用两个指针来共同解决一个问题: 1.1 对撞双指针 比如先有一个有序的数组array int[] array {1, 4, 5, 7, 9}先要找两个…

# Kafka_深入探秘者(10):kafka 监控

Kafka_深入探秘者(10):kafka 监控 一、kafka JMX 1、JMX :全称 Java Managent Extension 在实现 Kafka 监控系统的过程中,首先我们要知道监控的数据从哪来,Kafka 自身提供的监控指标(包括 broker 和主题的…

Zabbix如何帮助企业将监控数据转化为竞争优势

By Fernanda Moraes 在我们生活的高度互联世界中,变化以越来越快和激烈的速度发生。这影响了消费者的认知与行为,迫使零售商寻找更有效的方式来吸引客户。Linx 是 StoneCo 集团旗下的一家公司,也是零售技术专家,Linx了解这一点&am…

无线麦克风领夹哪个牌子好,2024年领夹麦克风品牌排行榜推荐

​随着短视频热潮的兴起,越来越多的人倾向于用vlog记录日常生活,同时借助短视频和直播平台开辟了副业。在这一过程中,麦克风在近两年内迅速发展,从最初的简单收音功能演变为拥有多样款式和功能,以满足视频创作的需求。…

数据脱敏学习

数据脱敏是一种保护敏感信息的方法,它通过修改或删除数据中的敏感部分,使得数据在保持一定可用性的同时,不再直接关联到个人隐私或重要信息。 自然人指可以直接或间接标识 直接标识:如姓名、身份证号码、家庭住址、电话号码、电…

生命在于折腾——Macbook虚拟机开启360核晶

首先启动PD虚拟机,打开360,发现提示如下: 此时将虚拟机关机。 打开该虚拟机设置: 将虚拟机监控程序改为Parallels,并启动nested虚拟化。 改好后截图如下: 保存设置,开机 此时就可以开启了…

手机恢复已删除数据,3种情况下的解决办法,史诗级教程

手机已经变成了我们生活中的“黑匣子”,记录着我们的通讯录、照片、视频、聊天记录等各种重要数据。然而,由于误删、系统崩溃或其他不可预测的情况,我们可能会面临数据丢失的风险。 本文将为你提供一份史诗级的教程,详细介绍3种不…

10种超强图像特征提取算法Python代码实现

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类算法的家人,可关注我的VX公众号:python算法小当家,不定期会有很多免费代码分享~ 图像特征提取是计算机视觉和图像处理的关键步骤,因…

零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算 四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式 五.CubeMX配置一个ADC采集例程六.CubeMX工程源…

Nginx反向代理实现Vue跨域注意事项

1、通过搜索引擎访问Nginx官网——免费使用——NGINX开源版(免费下载)或者通过以下链接直接访问Nginx下载页面下载对应的版本(下载页面)。以下以1.24.0为例 2、修改nginx的配置文件,在conf文件夹下,文件名为nginx.conf;以下是我修改完的配置…

【Python数据分析与可视化】:使用【Matplotlib】实现销售数据的全面分析 ——【Matplotlib】数模学习

目录 安装Matplotlib 1.打开PyCharm: 2.打开终端: 3.安装Matplotlib: 4.确认安装: 导入Matplotlib 创建简单的折线图 代码解析: 创建子图 代码解析: 创建柱状图 代码解析: 创建散点…

总结一下Linux、Windows、Ubuntu、Debian、CentOS等到底是啥?及它们的区别是什么

小朋友你总是有很多问好 你是否跟我一样,不是计算机科班出身,很多东西都是拿着在用,并不知道为什么,或者对于它们的概念也是稀里糊涂的,比如今天说的这个。先简单描述下,我先前的疑问: Linux是…