题解 | #购物单#

购物单

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,不理解为什么选不出来

全部评论

相关推荐

头像
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务