代码如下:
public class Main {
static int[] value = { 0, 1500, 3000, 2000 };
static int[] weight = { 0, 1, 4, 3 };
static int c = 4; // 背包容量
static int n = 3; // 物品个数
static int[][] dp = new int[n + 1][c + 1];
public static void main(String[] args) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= c; j++) {
if (j - weight[i] >= 0) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.println(dp[n][c]);
}
}
使用滚动数组:
public class Main {
static int[] value = { 0, 1500, 3000, 2000 };
static int[] weight = { 0, 1, 4, 3 };
static int c = 4; // 背包容量
static int n = 3; // 物品个数
static int[] dp = new int[c + 1];
public static void main(String[] args) {
for (int i = 1; i <= n; i++) {
// 如果我们处理第一行,由于只有一个物品,所以该for循环执行的语句自动变成了只要j>=weight[1],就把他装入背包
for (int j = c; j >= weight[i]; j--) { // 注意这里j初值为c,从每一列的最后往前处理
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
System.out.println(dp[c]);
}
}