题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
money, nums = list(map(int, input().split()))
w = {} # 存储重量,即花的钱
v = {} # 存储价值,即满意度
zhu = {} # 存储主件信息
fu ={} # 存储附件信息
for i in range(1, nums + 1): # 读取输出
a, b, c = list(map(int, input().split())) # 价格 权重 是否主件
if c == 0:
zhu[i] = [a, b] # 主件是二维的
else:
if c not in fu: # 该主件未存储相关的附件
fu[c] = [[a, b]]
else:
fu[c].append([a, b]) # 附件是三维的 ,拼接附件
# print(zhu,fu)
for k in zhu: # 以遍历主件作为外层循环
w[k] = [zhu[k][0]] # 只买主件的情况,花的钱
v[k] = [zhu[k][0]*zhu[k][1]] # 满意度
# 买一件的情况
if k in fu: # 如果主件存在附件
w[k].append(zhu[k][0] + fu[k][0][0]) # 花多少钱是二维的,主件加第一个附件的钱
v[k].append(v[k][0] + fu[k][0][0]*fu[k][0][1]) # 满意度是二维的,件加第一个附件的满意度
if len(fu[k]) > 1: # 如果主件存在两个附件
w[k].append(zhu[k][0] + fu[k][0][0] + fu[k][1][0]) # 三件花的钱
v[k].append(v[k][1] + fu[k][1][0]*fu[k][1][1]) #三件的满意度
#只买第二个附件
w[k].append(zhu[k][0] + fu[k][1][0])
v[k].append(v[k][0] + fu[k][1][0]*fu[k][1][1])
# print(fu,zhu)
# print(w,v)
dp = [0]*(money+1)
for i in zhu:
for m in range(money, -1, -10): #从后往前遍历钱,前面的数据就相当于上一次遍历的数据
max_manyi = dp[m]
for j in range(len(w[i])):
if m - w[i][j] >= 0:
max_manyi = max(max_manyi, dp[m - w[i][j]] + v[i][j])
dp[m] = max_manyi
# print(dp)
print(dp[money])
查看26道真题和解析
联想公司福利 1548人发布