小尼写的这篇page是针对完全背包问题所写的。首先我们需要知道的就是什么是完全背包问题,小尼做一个简单的介绍,就是有N件物品和一个最多能被重量为W的背包。其中第i件物品重量是weight[i],得到的价值是value[i]。完全背包问题与0-1背包问题的最大的区别就是每件物品都有无限个(也就是可以放入背包多次),再求解将哪些物品放入背包里最后物品的价值总和最大。
小尼因为之前已经谢过了0-1背包问题,所以在这里小尼直接就写出完全背包问题与0-1背包问题的区别,首先就是我们的遍历顺序,完全背包问题的遍历可以直接进行前序遍历,并且我们的遍历顺序没有限制,也就是说我们的遍历可以先遍历物品后遍历背包,或者是先遍历背包后遍历物品,这个不会影响我们最后背包放入的结果,我们遍历顺序的改变,其实就是一个从行进行放入结果,一个是从列放入结果。
小尼拉一下代码:
//先遍历物品,再遍历背包
private static void testCompletePack(){
int[] weight = {1, 3, 4};
int[] value = {15, 20, 30};
int bagWeight = 4;
int[] dp = new int[bagWeight + 1];
for (int i = 0; i < weight.length; i++){ // 遍历物品
for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
for (int maxValue : dp){
System.out.println(maxValue + " ");
}
}
//先遍历背包,再遍历物品
private static void testCompletePackAnotherWay(){
int[] weight = {1, 3, 4};
int[] value = {15, 20, 30};
int bagWeight = 4;
int[] dp = new int[bagWeight + 1];
for (int i = 1; i <= bagWeight; i++){ // 遍历背包容量
for (int j = 0; j < weight.length; j++){ // 遍历物品
if (i - weight[j] >= 0){
dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]);
}
}
}
for (int maxValue : dp){
System.out.println(maxValue + " ");
}
}
希望可以帮助到小伙伴们~~~