U296062 多重背包板子

题目描述

假设有 $n$ 种物品和一个容量为 $V$ 的背包。 第 $i$ 种物品的体积为 $v_i$ ,价值为 $w_i$ ,可选数量为 $s_i$(即最多能够选 $s_i$ 个)。 求背包最多能装下多少物品,使他们的价值总和最大,只需要输出最大价值即可。

输入格式

$n$ $V$ $v_1$ $w_1$ $s_1$ $v_2$ $w_2$ $s_2$ $\vdots$ $v_n$ $w_n$ $s_n$

输出格式

$Valve_{max}$

说明/提示

可以令 $f(i,j)$ 表示现在考虑前 $i$ 种物品,容量为 $j$ 的背包能够获得的最大价值。则状态转移方程为: $$ f(i, j) = \max_{k=0}^{s_i}f(i-1, j-kv_i)+kw_i $$ 其中 $k$ 表示第 $i$ 种物品选择的数量。这个方程的意思是,要么不选第 $i$ 种物品,此时背包容量不变,获得的价值就是 $f(i−1,j)$ ;要么选 $k$ 个第 $i$ 种物品,此时获得的价值是 $k\times w_i$ ,背包容量减少 $k\times v_i$ ,剩下的背包容量对应的最大价值为 $f(i−1,j−kv_i)$。 最终的结果需要求解的是 $f(n,V)$,时间复杂度 $O(nVs)$ ,空间复杂度 $O(V)$(滚动数组压)。 $0 < n, V\le100$ $0 \le v_i, s_i, w_i\le 100$