【蓝桥杯省赛真题22】python剩余空间问题 青少年组蓝桥杯比赛python编程省赛真题解析

本文介绍了2020年青少年组蓝桥杯省赛Python编程题,要求通过递归解决在有限容器内使剩余空间最小的问题。解题思路涉及递归调用和条件判断,提供了程序代码和运行结果分析,同时推荐了相关比赛和等级考试资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

python剩余空间问题

一、题目要求

1、编程实现

二、解题思路

1、案例分析

三、程序代码

四、程序说明

五、运行结果

六、考点分析

七、推荐资料

1、蓝桥杯比赛

2、考级资料

3、其它资料


 

python剩余空间问题

2020年第青少年组python蓝桥杯省赛真题

一、题目要求

(注:input()输入函数的括号中不允许添加任何信息)

1、编程实现

现有一个容器,其容量为v (0v<1001,正整数),同时有n个物品 (0<n<=30),每个物品体积大小不同 (正整数)在n个物品中,任取若干个装入容器内,使容器的剩余空间为最小。

2、输入输出

输入描述:

输入容器大小V (0<V<1001,正整数) 输入物品数量n (0n=30) 输入n个物品的不同大小(正整数)

输出描述:

剩余最小空间值

输入样例:

100
4
50
20
45
19

说明:“100”输入的是容器大小V:“4"输入的是物品数量n:“50" “20" “45“ “19"输入的是4个物品体积 

输出样例:

5

说明:“5”是容器大小减掉4个物体不同组合后与容器大小最为接近的一组值。(物品组合个数不限制,只找最接近容器大小的值)

二、解题思路

1、案例分析

  1. 题目相对而言相对有点难度,需要对题目的认真思考,找到解题思路
  2. 解这道题目比较方便的一个办法是利用递归思路进行求解
  3. 递归调用自己,将列表中除了第一个物品以外的其他物品,如果都取完了还没有超过空间拿就直接就是,如果空间不够了,就返回0没办法再放进去了
  4. 在将剩余空间和第一个物品体积进行比较,如果大了说明可以放的下,就继续递归调用自己,最后比较两次得到的最小空间输出即可

三、程序代码

def fill(lst,space):
    if not lst:
        return space
    if not space:
        return 0
    rest = fill(lst[1:],space)
    if space>=lst[0]:
        first=fill(lst[1:],space-lst[0])
        result=min(first,rest)
    return result

v=int(input())
n=int(input())
list1 = []
for i in range(n):
    list1.append(int(input()))
    
print(fill(list1,v))

四、程序说明

上面程序用于计算在给定空间下可以拿多少个物品。给定一个物品列表(lst)和可用空间(space),程序会递归地计算在可用空间下可以拿多少个物品。下面是每一行代码的详细解释:

  • def fill(lst,space)::定义一个名为 fill 的函数,接收两个参数,即物品列表(lst)和可用空间(space)。
  • if not lst::如果物品列表为空,说明物品已经取完,直接返回可用空间。
  • if not space::如果可用空间为0,说明没有空间,无法放置任何物品,返回0。
  • rest = fill(lst[1:],space):递归调用 fill 函数,处理物品列表中除了第一个物品以外的其他物品,并将结果赋值给变量 rest。同时将可用空间的值赋给变量 space,以便在递归调用中处理空间的变化。
  • if space>=lst[0]::如果可用空间大于等于第一个物品的尺寸,说明有足够的空间放置第一个物品,继续下面的操作。
  • first=fill(lst[1:],space-lst[0]):递归调用 fill 函数,处理物品列表中除了第一个物品以外的其他物品,并将结果赋值给变量 first。同时将可用空间减去第一个物品的尺寸,以便计算第一个物品的放置空间。
  • result=min(first,rest):将 first 和 rest 中的较小值赋值给变量 result,表示在当前空间下最多可以放置的物品数量。
  • return result:返回最终结果。
  • v=int(input()):从标准输入中获取可用空间(room)。
  • n=int(input()):从标准输入中获取物品数量(n)。
  • list1 = []:创建一个空列表,用于存储物品列表。
  • for i in range(n)::循环遍历 n 次,每次从标准输入中获取一个物品的尺寸,并将其添加到列表中。
  • print(fill(list1,v)):调用函数 fill,计算在给定空间下可以拿多少个物品,并输出结果。

五、运行结果

100
4

50
20
45
19

5

六、考点分析

难度级别:难,这题相对而言还是有一点小难度,难在题目分分解,具体主要考查如下:

  1. input函数:Python 中 input() 函数接受一个标准输入数据,返回为 string 类型。
  2. 如何定义函数:定义了一个名为 fill 的函数,接收两个参数,即物品列表(lst)和可用空间(space)。
  3. 如何实现条件判断:在函数中使用了多个条件判断语句,例如 if not lst: 和 if not space:,用于判断列表是否为空或可用空间是否为0。
  4. 掌握递归调用:在函数中进行了多次递归调用,例如第4行和第5行。递归调用指的是在一个函数中调用自身的行为。
  5. 熟悉列表切片:在第4行中使用了列表切片(lst[1:]),用于获取物品列表中除了第一个物品以外的其他物品。
  6. 最小值函数:在第7行中使用了最小值函数(min(first,rest)),用于获取当前空间下最多可以放置的物品数量。
  7. 充分掌握函数定义、递归调用和列表相关操作函数的使用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

七、推荐资料

1、蓝桥杯比赛

2、考级资料

3、其它资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小兔子编程

您的鼓励是我创作优质案例的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值