历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 2023年3月编程题(9)

学习Python从娃娃抓起!记录下蓝桥杯备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 汇总


【题目描述】
假设果园中有N(1≤N≤100)种水果。猴子想要采摘一些水果带回家,但猴子采摘水果的总重量不能超过W(1≤W≤1000)。
已知每种水果的最大采摘数量Ni(1≤Ni≤100)、每种水果单个的重量Wi(1≤Wi≤100)以及每种水果单个的维生素含量Vi(1≤Vi≤100)。
在采摘水果的总重量不超过w的情况下,猴子最多可以获得多少维生素。
例如:N=3,W=5,表示有3种水果,且猴子采摘水果的总重量不能超过5。
每种水果的最大采摘数量Ni、每种水果单个的重量Wi及每种水果单个的维生素含量Vi,如下表:
[图片]

猴子可按以下方式采摘,获得最多的维生素:
1)采摘第一种水果3个,3个水果的重量为3,3个水果维生素含量为6;
2)采摘第二种水果1个,1个水果的重量为2,1个水果维生素含量为4;
水果总的维生素含量最多为10(10=6+4)。
【输入】
第一行输入两个正整数N(1≤N≤100)和W(1≤W≤1000),分别表示水果的种类数和猴子最多可采摘的水果总重量,两个正整数之间以一个空格隔开
接下来N行,每行输入三个正整数Ni(1≤Ni≤100)和Wi(1≤Wi≤100)及Vi(1≤Vi≤100),分别表示某种水果的最大采摘数量和某种水果单个的重量及某种水果单个的维生素含量,正整数之间以一个空格隔开
【输出】
输出一个整数,表示在不能超过水果总重量w的情况下,猴子最多能获得到的维生素值
【输入样例】

3 5
4 1 2
1 2 4
2 4 5

【输出样例】

10

【代码详解】
[图片]

n, w = [int(i) for i in input().split()]
ni = [0 for i in range(105)]
wi = [0 for i in range(105)]
vi = [0 for i in range(105)]
dp = [0 for i in range(105)]
for i in range(1, n+1):  # 遍历n行输入
    ls = [int(i) for i in input().split()]
    ni[i] = ls[0]  # 记录ni
    wi[i] = ls[1]  # 记录wi
    vi[i] = ls[2]  # 记录vi
for i in range(1, n+1):  # 混合背包模板
    for j in range(w, 0, -1):  # 使用一维滚动数组(类似于01背包)
        for k in range(0, ni[i]+1):  # 因为可以取的数量有限,所以需要定义k
            if j>=k*wi[i]:  # 只有当j满足条件时
                dp[j] = max(dp[j], dp[j-k*wi[i]] + k*vi[i])  # 递推公式
print(dp[w])  # 打印结果

【运行结果】

3 5
4 1 2
1 2 4
2 4 5
10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值