算法题 背包问题-多重背包 二进制优化版本(Python)

题目

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式

输出一个整数,表示最大价值。

数据范围

0 0 0

提示:

本题考查多重背包的二进制优化方法。

输入样例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:

10

代码

N, V = map(int, input().split())
dp = [0] * (V+1)

# 算法复杂度o(N*log(S)*V)
for _ in range(N):
    v, w, s = map(int, input().split())
    t = 1
    while s >= t:
        for j in range(V, v*t-1, -1):
            dp[j] = max(dp[j], dp[j - t*v] + t*w)
        s -= t
        t *= 2
    if s:
        for j in range(V, v*s-1, -1):
            dp[j] = max(dp[j], dp[j - s*v] + s*w) 
print(dp[-1])

 

你可能感兴趣的:(算法题,Python,每日算法题,算法,python,动态规划,leetcode,背包问题)