题解 | #购物单 Python3 详细注释

购物单

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

参考一位大佬的思路,写出的Python代码

from collections import defaultdict

# 处理输入
n, m = map(int, input().split())
n //= 10  # 价格总为 10 的倍数,优化空间复杂度
prices = defaultdict(lambda: [0, 0, 0])  # 主从物品的价格
values = defaultdict(lambda: [0, 0, 0])  # 主从物品的价值

for i in range(m):      # i 代表第 i + 1 个物品
    v, p, q = map(int, input().split())
    v //= 10            # 价格总为 10 的倍数,优化空间复杂度
    if q == 0:          # 追加主物品
        prices[i + 1][0] = v
        values[i + 1][0] = v * p
    elif prices[q][1]:  # 追加从物品
        prices[q][2] = v
        values[q][2] = v * p
    else:
        prices[q][1] = v
        values[q][1] = v * p

# 处理输出
dp = [0] * (n + 1)  # 初始化 dp 数组

for i, v in prices.items():
    for j in range(n, v[0] - 1, -1):
        p1, p2, p3 = v
        v1, v2, v3 = values[i]
        # 处理主从组合的四种情况
        dp[j] = max(dp[j], dp[j - p1] + v1)
        dp[j] = max(dp[j], dp[j - p1 - p2] + v1 + v2) if j >= p1 + p2 else dp[j]
        dp[j] = max(dp[j], dp[j - p1 - p3] + v1 + v3) if j >= p1 + p3 else dp[j]
        dp[j] = max(dp[j], dp[j - p1 - p2 - p3] + v1 + v2 + v3) if j >= p1 + p2 + p3 else dp[j]

print(dp[n] * 10)
全部评论
我觉得第26行,步长是-1那里,改成最大公约数比较好,毕竟第一个示例数据里要无效循环几百次
点赞 回复 分享
发布于 2022-02-15 15:16
我觉得比最高赞简洁一点。
点赞 回复 分享
发布于 2022-02-23 18:39
第二层循环没太看懂 for j in range(n, v[0] - 1, -1):
点赞 回复 分享
发布于 2022-08-08 21:03
more clean, good
点赞 回复 分享
发布于 2023-03-28 16:32 广东
自测输入 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 1000 5 0 实际输出 2200 自测输入 1000 5 1000 5 0 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 实际输出 5000 Why?
点赞 回复 分享
发布于 2023-09-14 17:46 广东
你这写法只能加两个从物品吧
点赞 回复 分享
发布于 09-05 15:29 北京

相关推荐

10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
45 18 评论
分享
牛客网
牛客企业服务