目录
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、案例分析
- 题目相对而言相对有点难度,需要对题目的认真思考,找到解题思路
- 解这道题目比较方便的一个办法是利用递归思路进行求解
- 递归调用自己,将列表中除了第一个物品以外的其他物品,如果都取完了还没有超过空间拿就直接就是,如果空间不够了,就返回0没办法再放进去了
- 在将剩余空间和第一个物品体积进行比较,如果大了说明可以放的下,就继续递归调用自己,最后比较两次得到的最小空间输出即可
三、程序代码
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
六、考点分析
难度级别:难,这题相对而言还是有一点小难度,难在题目分分解,具体主要考查如下:
- input函数:Python 中 input() 函数接受一个标准输入数据,返回为 string 类型。
- 如何定义函数:定义了一个名为
fill
的函数,接收两个参数,即物品列表(lst)和可用空间(space)。 - 如何实现条件判断:在函数中使用了多个条件判断语句,例如
if not lst:
和if not space:
,用于判断列表是否为空或可用空间是否为0。 - 掌握递归调用:在函数中进行了多次递归调用,例如第4行和第5行。递归调用指的是在一个函数中调用自身的行为。
- 熟悉列表切片:在第4行中使用了列表切片(lst[1:]),用于获取物品列表中除了第一个物品以外的其他物品。
- 最小值函数:在第7行中使用了最小值函数(min(first,rest)),用于获取当前空间下最多可以放置的物品数量。
- 充分掌握函数定义、递归调用和列表相关操作函数的使用
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!