题解 | 【模板】多重背包

def solve_multiple_knapsack_optimized(n, m, items):
    # 二进制优化后的物品列表
    binary_items = []
    
    # 将物品按二进制拆分
    for w, v, s in items:
        k = 1
        while s > 0:
            amount = min(k, s)
            binary_items.append((w * amount, v * amount))
            s -= amount
            k *= 2
    
    # 01背包问题求解
    dp = [0] * (m + 1)
    for w, v in binary_items:
        for j in range(m, w - 1, -1):
            dp[j] = max(dp[j], dp[j - w] + v)
    
    return dp[m]

# 主程序
T = int(input())
for _ in range(T):
    n, m = map(int, input().split())
    items = []
    for _ in range(n):
        w, v, s = map(int, input().split())
        items.append((w, v, s))
    result = solve_multiple_knapsack_optimized(n, m, items)
    print(result)

全部评论

相关推荐

咪咪虫:小厂神人多,我昨天早上那个深圳500-1000人的厂,面试官迟到10分钟进来第一句话是:居然是个妹子,然后一直说自己没有准备什么的,全程八股都是支支吾吾的问。下午那个线下的广州280人的厂,二轮技术面一直在问我数据结构、操作系统、计算机网络,还问我高考多少分、为什么不上课、为什么住在学校外面、是什么时候高考的。。。脸上就是质疑和不屑,俩个体验感奇差
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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