学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客
【题目描述】
假设果园中有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,如下表:
第一种水果拿3个,第二种水果拿1个,第三种水果不拿,总体积为5,最大可获得维生素含量为3 * 2 + 4 * 1 = 10。
【输入描述】
第一行输入两个正整数表示N,W,数字之间以空格隔开
接下来N行,每行输入3个正整数,分别表示Ni,Wi,Vi,数字之间以空格隔开
【输出描述】
输出一个数,表示在采摘水果的总重量不超过W的情况下,猴子最多可以获得多少维生素
【样例输入】
3 5
4 1 2
1 2 4
2 1 1
【样例输出】
10
【代码详解】
N, W = [int(i) for i in input().split()]
Ni = []
Wi = []
Vi = []
for i in range(N):
ls = [int(i) for i in input().split()]
Ni.append(ls[0])
Wi.append(ls[1])
Vi.append(ls[2])
F = [0 for i in range(0, W+1)]
def CompleteBackPack(w, v):
for i in range(w, W + 1):
F[i] = max(F[i], F[i-w] + v)
def OneZeroBackPack(w, v):
for i in range(W, w -1, -1):
F[i] = max(F[i], F[i-w] + v)
def MultipleBackPack(w, v, n):
if w * n >= W:
CompleteBackPack(Wi[i], Vi[i])
return
temp_n = 1
while temp_n < n:
OneZeroBackPack(temp_n * w, temp_n * v)
n -= temp_n
temp_n *= 2
OneZeroBackPack(n * w, n * v)
for i in range(0, N):
MultipleBackPack(Wi[i], Vi[i], Ni[i])
print(F[W])
复制代码
【运行结果】
3 5
4 1 2
1 2 4
2 1 1
10