动态规划——多重背包
题目描述
有 n 种物品和一个容量为 capacity 的背包,且每种物品【数量有限】。
第 i 件物品的质量是 weight[i] ,价值是 values[i] ,数量为 nums[i]。
问:选择哪些物品,每种物品选择多少件,可使得总价值最大?
输入:capacity = 5 , weight = [1,2] , values = [1,2] , nums = [2,1]
输出:4
选择两件物品1,再选一件物品2,可以使价值最大
朴素二维
- 状态定义 dp[i] [j] :考虑前 i 件物品。且所选物品总体积不超过 j 时获得的最大价值,且物品数量不能超
- 状态转移方程 dp[i] [j] = max(dp[i-1] [j] , dp[i-1] [j - k * value(i)] + k * value(i) ) 0 < k <= s[i] 0 < k * value(i) <= j
- 初始化 maxK = math.min(j/ weight(i) , s[i]) dp[0] [j] = maxK * value(i) 能装多少装多少
代码如下:
public int maxValue( int capacity, int[] nums, int[] weight, int[] values){
int n = nums.length;
int[][] dp = new int[n][capacity+