前言
之前入门算法用代码随想录(代码随想录),将递归,动态规划这些都学了一遍,也自己动手实现过,但之前也是边参考边写出来的,而且隔了有一段时间了,最近二刷一次!!这次挑战尽量自己写出来。
题目
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
代码
public class _19_多重背包 {
/**
* 多重背包:我理解介于完全背包和01背包之间,物品不是无限的,但也有多个 ,将物品扩展出来,就变成01背包问题
*/
public static void main(String[] args) {
List<Integer> weight = new ArrayList<>(Arrays.asList(1, 3, 4));
List<Integer> value = new ArrayList<>(Arrays.asList(15, 20, 30));
List<Integer> nums = new ArrayList<>(Arrays.asList(2, 3, 2));
int bagWeight = 10;
// dp: 容量i能装下的最大价值
int[] dp = new int[bagWeight + 1];
//先物后包
for (int i = 0; i < nums.size(); i++) {
for (int z = 0; z < nums.get(i); z++) {
for (int j = bagWeight; j >= weight.get(i); j--) {
dp[j] = Math.max(dp[j], dp[j - weight.get(i)] + value.get(i));
}
}
}
System.out.println(dp[bagWeight]);
}
}