1.三种背包问题
先来回顾一下三个背包问题的定义:
01背包:
有N件物品和一个容量为V的背包,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。
完全背包:
有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。
多重背包:
有N种物品和一个容量为V的背包,第i种物品最多有Mi件可用,每件物品消耗的容量为Ci,价值为Wi,求解入哪些物品可以使得背包中总价值最大。
给出代码和注释
public class Main {
public static void main(String[] args) {
int bag=10;
int[] weight={1,3,5,3,5,1,5};
int[] price= {4,1,2,5,7,3,12};
int num=weight.length; //物品数量
int[][] dp=new int[num+1][bag+1]; //定义一个二维矩阵,每个位置代表当前容量下放入当前物品的最大值
for(int i=1;i<=num;i++){ //i个物品
for(int j=1;j<=bag;j++){ //背包的大小
//解释第一轮循环的含义,当当前待选择的物品为1时,根据当前背包的容量不同,选择是否放入当前物品
//如果当前物品的重量超过背包大小,则不放
//然后再判断当前物品放入之前和放入之后的数值大小,放入之后的数值大小计算方式为dp[i-1][j-weight[i-1]]+price[i-1]
//,因为若要放入,则需要前一次的容量还需要留空
if(weight[i-1]>j){
dp[i][j]=dp[i-1][j];
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-weight[i-1]]+price[i-1]);
}
}
}
//输出最大值
System.out.println(dp[weight.length][bag]);
}
}