题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
# 输入:total_money为总钱数,m为可以购买物品的个数
total_money, m = map(int, input().split())
# 物品价格v,物品重要度p,物品主件附件属性q
# 单价表 Price[i] = v
Price = {}
# 价值表 Value[i] = p*v
Value = {}
# 记录主件编号
primary_key = []
# 初始化:单价表Price和价值表Value
# 三个元素为主件,附件1,附件2(题中最多有两个附件)
for i in range(m):
Price[i] = [0, 0, 0]
Value[i] = [0, 0, 0]
# 输入:物品价格v,物品重要度p,物品主件附件属性q
for i in range(m):
v, p, q = map(int, input().split())
if q == 0:
Price[i][0] = v
Value[i][0] = p * v
primary_key.append(i)
else:
if Price[q - 1][1] == 0:
Price[q - 1][1] = v
Value[q - 1][1] = p * v
else:
Price[q - 1][2] = v
Value[q - 1][2] = p * v
# 把构建的单价表和价值表压缩
Price_list = []
Value_list = []
for key in Price.keys():
if key in primary_key:
Price_list.append(Price[key])
Value_list.append(Value[key])
# 主件的个数
primary_number = len(Price_list)
# 创建01背包问题的思考表格,行数为(主件物品数+1),列数为(总钱数/10)+1
dp = [[0]*(int(total_money/10) + 1) for _ in range(primary_number + 1)]
total = int(total_money / 10)
for i in range(1, primary_number + 1): # 遍历每个“主件”
P0 = Price_list[i-1][0] # 第i个主件自身的单价
P1 = Price_list[i-1][1] # 第i个主件附件1的单价
P2 = Price_list[i-1][2] # 第i个主件附件2的单价
V0 = Value_list[i-1][0] # 第i个主件自身的价值
V1 = Value_list[i-1][1] # 第i个主件附件1的价值
V2 = Value_list[i-1][2] # 第i个主件附件2的价值
for j in range(total + 1):
# 什么都不买
dp[i][j] = dp[i - 1][j]
# 只买主件
if 10 * j >= P0:
dp[i][j] = max(dp[i][j], dp[i - 1][j - int(P0/10)] + V0)
# 主件+附件1
if 10 * j >= P0 + P1:
dp[i][j] = max(dp[i][j], dp[i - 1][j - int(P0/10) - int(P1/10)] + V0 + V1)
# 主件+附件2
if 10 * j >= P0 + P2:
dp[i][j] = max(dp[i][j], dp[i - 1][j - int(P0/10) - int(P2/10)] + V0 + V2)
# 主件+附件1+附件2
if 10 * j >= P0 + P1 + P2:
dp[i][j] = max(dp[i][j], dp[i - 1][j - int(P0/10) - int(P1/10) - int(P2/10)] + V0 + V1 + V2)
print(dp[primary_number][total])