题解 | 购物单
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
import sys
# 1、把物品分类:主品,附件,分别存储它们对应的价格、满意度。把所有价格下的满意度用列表dp存储
almoney, alquantity = map(int, input().split())
main_products, accessories = {}, {}
for i in range(1, alquantity + 1):
val, importance, clas = map(int, input().split())
if clas == 0:
main_products[i] = [val, val * importance]
else:
if clas in accessories:
accessories[clas].append([val,val * importance])
else:
accessories[clas] = [[val, val * importance]]
dp = [0] * (almoney + 1)
# 2、列出每一个主件的价格和满意度。用列表存储:不带附件时、带1个、带2个附件时的价格和满意度
for k, v in main_products.items():
va = []
satisfaction = []
# k是名称,v[0]是单价,存储到va列表中。v[1]是满意度
va.append(v[0])
satisfaction.append(v[1])
# 如果k有附件
if k in accessories:
# 那就让单价加上附件1(也就是[k][0]的单价 va是单价
va.append(va[0] + accessories[k][0][0])
satisfaction.append(satisfaction[0] + accessories[k][0][1])
if len(accessories[k]) > 1:
va.append(va[0] + accessories[k][1][0])
satisfaction.append(satisfaction[0] + accessories[k][1][1])
va.append(va[0] + accessories[k][0][0] + accessories[k][1][0])
satisfaction.append(
satisfaction[0] + accessories[k][0][1] + accessories[k][1][1]
)
# 3、遍历能出的金额-从高到低
for i in range(almoney, -1, -10):
# 对于不同的组合,如果金额>该物品及其附件的价格
for key, n in enumerate(va):
if i - va[key] >= 0:
#花该价钱的最大满意度=没买当前商品时的最大满意度+买这个商品的满意度
dp[i] = max(dp[i], dp[i - va[key]] + satisfaction[key])
print(dp[almoney])
