对于多重背包,我在⼒扣上还没发现对应的题⽬,所以这⾥就做⼀下简单介绍,⼤家⼤概了解⼀下。有N种物品和⼀个容量为V 的背包。第i种物品最多有Mi件可⽤,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装⼊背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最⼤。多重背包和01背包是⾮常像的, 为什么和01背包像呢?每件物品最多有Mi件可⽤,把Mi件摊开,其实就是⼀个01背包问题了。
例如:
背包最⼤重量为10。
物品为:
问背包能背的物品最⼤价值是多少?和如下情况有区别么?
毫⽆区别,这就转成了⼀个01背包问题了,且每个物品只⽤⼀次。
这种⽅式来实现多重背包的代码如下:
public static void main(String[] args) {
System.out.println(dp3(new int[]{1,3,4},new int[]{15,20,30},new int[]{2,3,2},4));
}
public static int dp3(int[] weight, int[] value, int[] nums, int bagWeight){//weight物品重量;value物品价值;nums物品数量;bagWeight背包容量;
int[] dp = new int[bagWeight + 1];
ArrayList<Integer> weightList = new ArrayList<>();
ArrayList<Integer> valueList = new ArrayList<>();
for (int j : weight) weightList.add(j);//转为集合方便增加物品
for (int j : value) valueList.add(j);//转为集合方便增加物品
for(int i = 0; i < nums.length; i++){//nums[i]保留到1,把其他物品都展开
while(nums[i] > 1){
weightList.add(weight[i]);//增加物品重量
valueList.add(value[i]);//增加物品价值
nums[i]--;
}
}
for (int i = 0; i < weightList.size(); i++)//遍历物品
for (int j = bagWeight; j >= weightList.get(i); j--) {//遍历背包
dp[j] = Math.max(dp[j], dp[j - weightList.get(i)] + valueList.get(i));
}
return dp[bagWeight];
}
从代码⾥可以看出是01背包⾥⾯在加⼀个for循环遍历⼀个每种商品的数量。 和01背包还是如出⼀辙的。