package com.dongtaiguihua;
import java.util.Arrays;
//完全背包问题
//有n种物品,物品的价值为v[2,4,7];对应的重量w[6,5,10],背包的容量为c = 10,计算包最多装物品的价值?(每个物品可以取无限个)
public class PackageCompletely {
public static void main(String[] args) {
int[] w = {5, 7};//重量
int[] v = {5, 8};//价值
int c = 10;//容量
System.out.println(getPackageMaxValue01(w, v, c));
System.out.println("********************************************");
System.out.println(getPackageMaxValue02(w, v, c));
}
public static int getPackageMaxValue01(int[] w, int[] v, int C) {//空间未优化
int size = w.length;
int[][] dp = new int[size][C + 1];
//初始化第一行
//仅考虑容量为C的背包放第0个物品的情况,物品从0开始
for (int i = 0; i <= C; i++) {
for (int k = 0; k * w[0] <= i; k++) {
dp[0][i] = k * v[0];
}
}
//填充其他行和列
for (int i = 1; i < size; i++) {//从1号物品遍历
for (int j = 0; j <= C; j++) {
dp[i][j] = dp[i - 1][j];//初始化未不装第i件商品
for (int k = 1; k * w[i] <= j; k++) {
if (dp[i][j - k * w[i]] + k * v[i] > dp[i][j]) {
dp[i][j] = dp[i][j - k * w[i]] + k * v[i];
}
}
}
}
for (int[] ints : dp) {
System.out.println(Arrays.toString(ints));
}
return dp[size - 1][C];
}
public static int getPackageMaxValue02(int[] w, int[] v, int C) {//优化空间
int size = w.length;
int[] dp = new int[C + 1];
//初始化第一行
//仅考虑容量为C的背包放第0个物品的情况,物品从0开始
for (int i = 0; i <= C; i++) {
for (int k = 0; k * w[0] <= i; k++) {
dp[i] = k * v[0];
}
}
System.out.println(Arrays.toString(dp));
//填充其他行和列
for (int i = 1; i < size; i++) {//从1号物品遍历
for (int j = C; j > 0; j--) {
for (int k = 1; k * w[i] <= j; k++) {
if (dp[j - k * w[i]] + k * v[i] > dp[j]) {
dp[j] = dp[j - k * w[i]] + k * v[i];
}
}
}
System.out.println(Arrays.toString(dp));
}
return dp[C];
}
}
完全背包问题
最新推荐文章于 2024-04-23 15:08:59 发布