题解 | #购物单#

购物单

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

money, nums = list(map(int, input().split()))

w = {}  # 存储重量,即花的钱
v = {} # 存储价值,即满意度

zhu = {}  # 存储主件信息
fu ={} # 存储附件信息

for i in range(1, nums + 1):  # 读取输出
    a, b, c = list(map(int, input().split())) # 价格 权重 是否主件
    if c == 0:
        zhu[i] = [a, b] # 主件是二维的
    else:
        if c not in fu:  # 该主件未存储相关的附件
            fu[c] = [[a, b]]
        else:
            fu[c].append([a, b]) # 附件是三维的 ,拼接附件

# print(zhu,fu)

for k in zhu:  # 以遍历主件作为外层循环
    w[k] = [zhu[k][0]]  # 只买主件的情况,花的钱
    v[k] = [zhu[k][0]*zhu[k][1]] # 满意度
    
    # 买一件的情况
    if k in fu:   # 如果主件存在附件
        w[k].append(zhu[k][0] + fu[k][0][0]) # 花多少钱是二维的,主件加第一个附件的钱
        v[k].append(v[k][0] + fu[k][0][0]*fu[k][0][1]) # 满意度是二维的,件加第一个附件的满意度

        if len(fu[k]) > 1: # 如果主件存在两个附件
            w[k].append(zhu[k][0] + fu[k][0][0] + fu[k][1][0]) # 三件花的钱
            v[k].append(v[k][1] + fu[k][1][0]*fu[k][1][1]) #三件的满意度
            #只买第二个附件
            w[k].append(zhu[k][0] + fu[k][1][0])
            v[k].append(v[k][0] + fu[k][1][0]*fu[k][1][1])
    # print(fu,zhu)
    # print(w,v)

dp = [0]*(money+1)


for i in zhu:
    for m in range(money, -1, -10):  #从后往前遍历钱,前面的数据就相当于上一次遍历的数据
        max_manyi = dp[m]
        for j in range(len(w[i])):
            if m - w[i][j] >= 0:
                max_manyi = max(max_manyi, dp[m - w[i][j]] + v[i][j])
        dp[m] = max_manyi
    # print(dp)

print(dp[money])





全部评论

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
比亚迪汽车新技术研究院 硬件工程师 总包21左右 硕士
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务