题解 | #购物单#

购物单

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

money, number = list(map(int, input().strip().split()))
money = money // 10
main = [[[0, 0], [0, 0], [0, 0]] for _ in range(number + 2)]
for i in range(1, 1 + number):
    v, p, q = list(map(int, input().strip().split()))
    if q == 0:  # 主件
        main[i][0] = [v // 10, v * p]
    else:
        if main[q][1][0] == 0:
            main[q][1] = [v // 10, v * p]
        else:
            main[q][2] = [v // 10, v * p]
main = [i for i in main if i[0][0] != 0]
dp = [[0 for i in range(1 + money)] for j in range(1 + len(main))]
for num in range(1, 1 + len(main)):
    for mon in range(1 + money):
        dp[num][mon] = dp[num - 1][mon]
        (p1, v1), (p2, v2), (p3, v3) = main[num - 1]
        # 不买前一个物品买这个物品和不买这个物品的最大值
        if mon >= p1:
            dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1] + v1)
        if mon >= p1 + p2:
            dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1 - p2] + v1 + v2)
        if mon >= p1 + p3:
            dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1 - p3] + v1 + v3)
        if mon >= p1 + p2 + p3:
            dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1 - p2 - p3] + v1 + v2 + v3)
print(dp[-1][-1])

全部评论

相关推荐

ZywOo_求职版:谁问你了....
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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