题解 | #购物单# AI给出的答案

购物单

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

def max_satisfaction(N, m, items):
    # 初始化dp数组,表示每个容量下的最大满意度
    dp = [0] * (N + 1)
    
    # 存储主件和附件的关系
    main_items = [[] for _ in range(m + 1)]  # 用来存储每个主件和它的附件列表
    for i in range(m):
        v, p, q = items[i]
        if q == 0:  # 主件
            main_items[i + 1].insert(0,(v, p))  # 把主件信息放进去
        else:  # 附件
            main_items[q].append((v, p))  # 将附件放到主件对应的列表中

    # 遍历每个主件,处理主件和其附件的组合
    for i in range(1, m + 1):
        if not main_items[i]:  # 如果该主件不存在,跳过
            continue
        
        # 拿到该主件和它的附件
        group = main_items[i]
        v0, p0 = group[0]  # 主件的价格和重要度
        v0p0 = v0 * p0  # 主件的满意度

        # 枚举背包容量
        for j in range(N, v0 - 1, -1):  # 从后往前更新DP,避免重复计算
            # 只选主件
            dp[j] = max(dp[j], dp[j - v0] + v0p0)
            
            # 选主件和一个附件1
            if len(group) >= 2:
                v1, p1 = group[1]
                if j >= v0 + v1:
                    dp[j] = max(dp[j], dp[j - v0 - v1] + v0p0 + v1 * p1)
            
            # 选主件和附件2
            if len(group) >= 3:
                v2, p2 = group[2]
                if j >= v0 + v2:
                    dp[j] = max(dp[j], dp[j - v0 - v2] + v0p0 + v2 * p2)

            # 选主件和两个附件
            if len(group) == 3:
                v1, p1 = group[1]
                v2, p2 = group[2]
                if j >= v0 + v1 + v2:
                    dp[j] = max(dp[j], dp[j - v0 - v1 - v2] + v0p0 + v1 * p1 + v2 * p2)

    return dp[N]


# 输入
N, m = map(int, input().split())
items = [tuple(map(int, input().split())) for _ in range(m)]

# 计算最大满意度
print(max_satisfaction(N, m, items))

全部评论

相关推荐

07-02 18:09
门头沟学院 Java
苍穹外卖和谷粒商城这俩是不是烂大街了,还能做吗?
想去重庆的鸽子在吐槽:你不如把这俩做完自己搞明白再优化点再来问 何必贩卖焦虑
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
宇算唯航:目测实缴资本不超100W的小公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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