题解 | #购物单#

购物单

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

全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务