题解 | #购物单# AI给出的答案
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
def max_satisfaction(N, m, items):
# 初始化dp数组,表示每个容量下的最大满意度
dp = [0] * (N + 1)
# 存储主件和附件的关系
main_items = [[] for _ in range(m + 1)] # 用来存储每个主件和它的附件列表
for i in range(m):
v, p, q = items[i]
if q == 0: # 主件
main_items[i + 1].insert(0,(v, p)) # 把主件信息放进去
else: # 附件
main_items[q].append((v, p)) # 将附件放到主件对应的列表中
# 遍历每个主件,处理主件和其附件的组合
for i in range(1, m + 1):
if not main_items[i]: # 如果该主件不存在,跳过
continue
# 拿到该主件和它的附件
group = main_items[i]
v0, p0 = group[0] # 主件的价格和重要度
v0p0 = v0 * p0 # 主件的满意度
# 枚举背包容量
for j in range(N, v0 - 1, -1): # 从后往前更新DP,避免重复计算
# 只选主件
dp[j] = max(dp[j], dp[j - v0] + v0p0)
# 选主件和一个附件1
if len(group) >= 2:
v1, p1 = group[1]
if j >= v0 + v1:
dp[j] = max(dp[j], dp[j - v0 - v1] + v0p0 + v1 * p1)
# 选主件和附件2
if len(group) >= 3:
v2, p2 = group[2]
if j >= v0 + v2:
dp[j] = max(dp[j], dp[j - v0 - v2] + v0p0 + v2 * p2)
# 选主件和两个附件
if len(group) == 3:
v1, p1 = group[1]
v2, p2 = group[2]
if j >= v0 + v1 + v2:
dp[j] = max(dp[j], dp[j - v0 - v1 - v2] + v0p0 + v1 * p1 + v2 * p2)
return dp[N]
# 输入
N, m = map(int, input().split())
items = [tuple(map(int, input().split())) for _ in range(m)]
# 计算最大满意度
print(max_satisfaction(N, m, items))
阿里云成长空间 763人发布