题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tqId=21239&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
n, m = map(int, input().split()) # 容量为n,物品为m
primary, annex = {}, {} # 创建空字典分别存放主、附件
for i in range(1, m + 1):
v, p, q = map(int, input().split())
if q == 0:
primary[i] = [v, p]
else:
if q not in annex: # 附件1
annex[q] = [[v, p]] #这里一定要双重[],如果是=[v,p],则添加附件2时会是[q1:[v1,p1,[v2,p2]]],我们想要的是[q1:[v1,p1],[v1,p1]]
else: # 附件2
annex[q].append([v, p])
# 符合满意度的几种情况:1、主件,2、主件+附件1,3、主件+附件2,4,主件+附件1+附件2
m = len(primary)
v, p = [[]], [[]] # 新建矩阵分别存放对应存放价格v及对应的满意度v*p,这里需要在索引为0的位置添加空列表
for key in primary:
v_weight, p_value = [], []
# 1、主件
v_weight.append(primary[key][0])
p_value.append(primary[key][0] * primary[key][1])
if key in annex:
# 2、主件+附件1
v_weight.append(primary[key][0] + annex[key][0][0])
p_value.append(primary[key][0] * primary[key][1] + annex[key][0][0] * annex[key][0][1])
if len(annex[key]) > 1: # 存在附件2
# 3、主件+附件2
v_weight.append(primary[key][0] + annex[key][1][0])
p_value.append(primary[key][0] * primary[key][1] + annex[key][1][0] * annex[key][1][1])
# 4、主件+附件1+附件2
v_weight.append(primary[key][0] + annex[key][0][0] + annex[key][1][0])
p_value.append(primary[key][0] * primary[key][1] + annex[key][0][0] * annex[key][0][1] + annex[key][1][0] * annex[key][1][1])
v.append(v_weight)
p.append(p_value)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(10, n + 1, 10):
max_i = dp[i - 1][j]
for k in range(len(v[i])):
if j >= v[i][k]:
max_i = max(max_i, dp[i - 1][j - v[i][k]] + p[i][k])
dp[i][j] = max_i
# for k in range(len(v[i])):
# if j >= v[i][k]:
# dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i][k]] + p[i][k])
print(dp[m][n])
代码如上,请问各位大佬,我最后注释的那边一部分筛选条件错在哪里了呀,为什么会不对呢
2000 10
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 5
400 4 0
320 2 0
410 3 0
400 3 5
这组数据正确结果应该是7430,注释内的代码筛选出来的是7400,不理解为什么选不出来

