动态规划:多重背包问题

240 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

题目描述

有 N 种物品和一个容量为 W 的背包,每种物品都有无限件可用。 第 i 种物品的重量是 w[i],价值是 v[i],最多有 s[i] 件 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

输入格式:

第一行两个整数, N 和 V ,用空格隔开,分别表示物品总数和背包的容积
接下来有 N 行。每行三个整数,w[i], v[i], s[i] 用空格隔开,分别表示第 i 种物品的体积和价值和数量

输出格式:

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

输入样式:

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

输出样式:

10

思路分析

和完全背包问题不同的是这里对物品的数量也有了限制。 如果不考虑优化时间和空间,我们其实可以简单的将多重背包问题转化为有多个重量相同价值相同的物品的0-1背包问题。这样一想其实多重背包就迎刃而解了。

代码实现

还是老毛病 j 表示行 i 表示列

# N 代表物品种类的数量, W 代表背包的容积
N, W = map(int, input().split())

weight = []
values = []

for i in range(N):
    w, v, s = map(int, input().split())
    count = 0
    while count < s:
        weight.append(w)
        values.append(v)
        count += 1
        
import numpy as np

box = np.zeros((len(weight), W+1))

for j in range(len(weight)):
    for i in range(W + 1):
        if j == 0:
            if i == weight[j]:
                box[j][i] = box[j][i-weight[j]] + values[j]
            else:
                box[j][i] = box[j][i-1]
        else:
            if i >= weight[j]:
                box[j][i] = max(box[j-1][i], box[j-1][i-weight[j]] + values[j])
            else:
                box[j][i] = box[j-1][i]
                
print(box)