学习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