题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
basic = list(map(int, input().split()))
N = basic[0]
items = []
for _ in range(basic[1]):
items.append(list(map(int, input().split())))
for i in range(len(items)):
if items[i][2]:
items[items[i][2] - 1].append(items[i][:])
items[i] = []
dp = [0] * (N + 1)
for itm in items:
if itm:
val = itm[0]
satis = itm[1]
if len(itm) == 3:
for i in range(N, -1, -1):
if val <= i:
dp[i] = max(dp[i], dp[i - val] + val * satis)
if len(itm) > 3:
dp_se = dp[:]
for i in range(N, -1, -1):
if val <= i:
dp_se[i] = dp[i - val] + val * satis # 选择第i件物品
for i in range(3, len(itm)):
val_a = itm[i][0]
w = itm[i][1]
for j in range(N, -1, -1):
if val_a + val <= j:
dp_se[j] = max(dp_se[j], dp_se[j - val_a] + val_a * w)
dp = [max(dp[i], dp_se[i]) for i in range(len(dp))]
print(dp[-1])
先把附属的物件加入进真正的物件中,在进行01背包的时候判断是否有附属物件,如果有的话就新增一个矩阵判断取的情况,最后再判断不增加和增加物件的dp向量的大小

