小马搬运物品-第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。

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

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

相关文章

如何与Honda建立EDI连接?

你是本田Honda的新供应商,需要具备EDI电子数据交换功能吗?在与本田Honda交换EDI消息时需要帮助吗?本文将带你快速了解Honda的EDI需求,明确EDI对接需要完成的工作。 项目背景 本田是一家世界领先的汽车制造商,在全球2…

仓库选址问题【数学规划的应用(含代码)】阿里达院MindOpt

本文主要讲述使用MindOpt工具优化仓库选址的数学规划问题。 视频讲解👈👈👈👈👈👈👈👈👈 一、案例场景 仓库选址问题在现代物流和供应链管理中具有重要的应用。因为仓库…

《数据结构与算法基础 by王卓老师》学习笔记——2.2线性表的案例引入

案例一:一元多项式的运算 案例二:稀疏多项式的运算 案例三:图书信息管理系统 总结

【Leetcode】520. 检测大写字母

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如 “USA” 。单词中所有字母都不是大写,比如 “le…

Mybatis入门——语法详解:基础使用、增删改查、起别名、解决问题、注释、动态查询,从入门到进阶

文章目录 1.基础使用1.添加依赖2.在resouces文件下新建xml文件db.properties3.在resouces文件下新建xml文件mybatis-config-xml4.创建一个MybatisUtils工具类5.创建xml文件XxxMapper.xml映射dao层接口6.添加日志5.测试 2.增删改查1.select2.delete3.update4.insert5.模糊查询6.…

同心创建 共践食安 | 赵梦澈荣获食品安全大使

“民族要复兴,乡村必振兴”,为深入贯彻落实国家乡村振兴战略,推进乡村全面振兴不断取得新成效,助力全国优质食品农产品的宣传推广、市场营销、品牌创建工作,由中国食品安全报社主办,商业发展中心、健康中国…

python数据分析与可视化一

公共部分 # 引入数据分析工具 Pandas import pandas as pd # 引入数据可视化工具 Matplotlib import matplotlib.pyplot as plt # 引入数据可视化工具 Seaborn (基于matplotlib) import seaborn as sns # 解决输出时的列名对齐问题 pd.set_option(display.unicode.east_…

Python多线程编程详解

Python多线程编程详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 多线程编程是利用计算机多核心和多线程处理器的优势,提高程序并发性能的重要…

如何申请免费SSL证书以消除访问网站显示连接不安全提醒

在当今互联网时代,网络安全已成为一个不可忽视的问题。当用户浏览一些网站时,有时会看到浏览器地址栏出现“不安全”的提示,这意味着该网站没有安装SSL证书,数据传输可能存在风险。那么,如何消除这种不安全提醒&#x…

2024年6月,Altair被Gartner魔力象限评为数据科学与机器学习平台领导者

Altair 因其愿景完整性和执行能力被评为领导者 2024 年 6 月 20 日,Altair(纳斯达克股票代码:ALTR)宣布,Altair RapidMiner 被 Gartner Magic Quadrant™(魔力象限)评为数据科学与机器学习平台领…

SpringBoot配置参数获取

1、使用Value注解 import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;Component public class MyBean {Value("${myapp.name}") private String appName;public void printAppName() {System.out.print…

幂等生产者和事务生产者

Kafka消息交付 Kafka消息交付可靠性保障以及精确处理一次语义的实现。 所谓的消息交付可靠性保障,是指Kafka对Producer和Consumer要处理的消息提供什么样的承诺。常见的承诺有以下三种: 最多一次(atmost once):消息…

SpringBoot:SpringBoot 调用第三方接口的几种方式

一、前言 在项目中调用第三方接口时,确实需要根据项目的技术栈、架构规范以及具体的业务需求来选择最适合的调用方式。比如:RESTful API调用、Feign声明式HTTP客户端、Apache HttpClient等调用方式,每种方式都有其适用场景和优势。下面我们就…

仓库管理系统16--入库管理

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现。 1、创建物资入库用户控件 <UserControl x:Class"West.StoreMgr.View.InStoreView"xmlns"http://schema…

CAS自旋解析

CAS全称CompareAndSwap(比较并交换)&#xff0c;是cpu的指令&#xff0c;调用时不涉及上下文的切换。Java中属于乐观锁的一种&#xff0c;具体流程如下图&#xff1a; 具体的实现使用的是Unsafe类去调用native修饰的compareAndSwap方法&#xff0c;4个字段分别是对象实例&#…

PTA—C语言期末复习(判断题)

1. C语言程序是从源文件的第一条语句开始执行的 &#xff08;F&#xff09; 在 C 语言中&#xff0c;程序是从 main 函数开始执行的&#xff0c;而不是从源文件的第一条语句开始执行 2. 若变量定义为double x;&#xff0c;则x % 2是符合C语言语法的表达式 &#xff08;F&#…

通过nginx去除 api url前缀 并保持后面剩余的url不变向后台请求

如 我前台浏览器向后台请求的接口是 http://127.0.0.1:5099/api/sample/sample/getbuttonlist 实际的请求接口传向 http://192.168.3.71:5099/sample/sample/getbuttonlist 方法是向config中加入下面这样一个server server {listen 5099;location /api/ {rewrite ^/a…

HTML流星雨

目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 岁月如梭&#xff0c;光阴似箭&#xff0c;不知不觉暑假就要来喽&#xff0c;本期小编用HTML给大家手搓了一个炫酷的流星雨动画&#xff0c;一起来看看吧。 完整代码 <!DOCTYPE html> <html lang…

项目风险管理系统有哪些?分享11款主流项目管理系统

本文将分享11款主流项目管理系统&#xff1a;PingCode、Worktile、StandardFusion、MasterControl、ClickUp、SAI360、Netwrix Auditor、MetricStream、Wrike、Celoxis、Zoho Projects。 在项目管理中&#xff0c;风险管理不仅是一个挑战&#xff0c;也是保证项目顺利进行的关键…

探索Vim的文本处理能力:精通查找与替换

探索Vim的文本处理能力&#xff1a;精通查找与替换 Vim&#xff0c;作为Linux终端下的王牌文本编辑器&#xff0c;以其强大的功能和灵活性深受开发者和系统管理员的喜爱。在Vim中进行查找和替换是文本编辑中的一项基础且重要的操作。本文将详细解释如何在Vim中执行查找和替换文…