public class ZeroOneBagII {
public static void main(String[] args) {
System.out.println(test());
}
private static int test() {
int[] weights = {1, 3, 4};
// int[] weights = {2, 2, 3, 1, 5, 2};
int[] values = {15, 20, 30};
// int[] values = {2, 3, 1, 5, 4, 3};
// return zeroOneBag(weights, values, 1);
return zeroOneBag(weights, values, 4);
}
private static int zeroOneBag(int[] weights, int[] values, int bagSize) {
// dp含义:能获得的最大价值量
int[][] dp = new int[values.length + 1][bagSize + 1];
// 没有物品或者没有容量时,总价值都为0
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[i].length; j++) {
if (j >= weights[i - 1]) {
// 当前 j 大于 i 物品重量时,可以考虑放或者不放,否则不能放入,只能和上一轮最大价值相同
// dp[i - 1][j]的含义是上i - 1个物品时,背包重量为j的大小,因此本轮是不放
// dp[i][j - weights[i - 1]] + values[i - 1]是本轮物品一定放,然后去寻找背包
// 容量-当前物品容量后的剩余容量时,上i - 1个物品可以放的最大价值
// 两个去比较大小,获取最大价值
// 以前初学的时候认为一定是放价值大,其实如果两个小的>一个大的,那么本轮放弃放入,
// 只放两个小的在同样重量下可以获取最大价值
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);
} else {
dp[i][j] = dp[i - 1][j];
}
// 返回结果当然是所有物品,最大背包重量的dp
}
}
return dp[dp.length - 1][bagSize];
}
}
01背包(dp版)
最新推荐文章于 2024-09-29 18:51:32 发布