一、多重背包基本理论
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi.求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
多重背包和01背包是非常像的, 为什么和01背包像呢?
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int capacity = scanner.nextInt();
int n = scanner.nextInt();
int[] weight = new int[n];
for(int i = 0 ; i < n ; i++){
weight[i] = scanner.nextInt();
}
int[] value = new int[n];
for(int i = 0 ; i < n ; i++){
value[i] = scanner.nextInt();
}
int[] count = new int[n];
for(int i = 0 ; i < n; i++){
count[i] = scanner.nextInt();
}
int[] dp = new int[capacity+1];
for(int i = 0; i < n ; i++){
for(int j = capacity ; j >= 0; j--){
for(int k = 1; k <= count[i]&&(j-k*weight[i]>=0) ; k++){
dp[j] = Math.max(dp[j],dp[j-k*weight[i]]+k*value[i]);
}
}
}
System.out.println(dp[capacity]);
}
}
背包问题总结参考:听说背包问题很难? 这篇总结篇来拯救你了
背包中的关键问题:递推公式、遍历顺序、初始化