题解 | #购物单# (转载)

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

#来自https://blog.nowcoder.net/n/bf369610fdec431fb0c02e09557004af?f=comment的解答,非常精彩,手敲一遍仅仅练习记录用
while True:
    try:
        # 总金额, 物品数量
        total, k = list(map(int, input().split(" ")))
        W = {}
        V = {}
        total = int(total / 10)
        main_key = []
        for i in range(1, k + 1):
            W[i] = [0, 0, 0]
            V[i] = [0, 0, 0]
        for i in range(k):
            # 单价,权重, 类别(主/辅)
            v, p, q = list(map(int, input().split(" ")))
            if q == 0:
                W[i + 1][0] = int(v / 10)
                V[i + 1][0] = int(v * p / 10)
                main_key.append(i + 1)
            else:
                if W[q][1] == 0:
                    W[q][1] = int(v / 10)
                    V[q][1] = int(v * p / 10)
                else:
                    W[q][2] = int(v / 10)
                    V[q][2] = int(v * p / 10)
        W_lst = []
        V_lst = []
        for key in W.keys():
            if key in main_key:
                W_lst.append(W[key])
                V_lst.append(V[key])
        m = len(W_lst)  # 主件数
        dp = [[0] * (total + 1) for _ in range(m + 1)]
        for i in range(1, m + 1):
            w1 = W_lst[i - 1][0]
            w2 = W_lst[i - 1][1]
            w3 = W_lst[i - 1][2]
            v1 = V_lst[i - 1][0]
            v2 = V_lst[i - 1][1]
            v3 = V_lst[i - 1][2]
            for j in range(total + 1):
                dp[i][j] = dp[i - 1][j]  # 不放
                if j - w1 >= 0:  # 放1个主件
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - w1] + v1)
                if j - w1 - w2 >= 0:  # 放1主件+附件1
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - w1 - w2] + v1 + v2)
                if j - w1 - w3 >= 0:  # 放1主件+附件2
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - w1 - w3] + v1 + v3)
                if j - w1 - w2 - w3 >= 0:  # 放1主件+附件1+附件2
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - w1 - w2 - w3] + v1 + v2 + v3)
        print(int(dp[m][total] * 10))
    except:
        break

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务