|
|
package class19;
|
|
|
|
|
|
public class Code01_Knapsack {
|
|
|
|
|
|
// 所有的货,重量和价值,都在w和v数组里
|
|
|
// 为了方便,其中没有负数
|
|
|
// bag背包容量,不能超过这个载重
|
|
|
// 返回:不超重的情况下,能够得到的最大价值
|
|
|
public static int maxValue(int[] w, int[] v, int bag) {
|
|
|
if (w == null || v == null || w.length != v.length || w.length == 0) {
|
|
|
return 0;
|
|
|
}
|
|
|
// 尝试函数!
|
|
|
return process(w, v, 0, bag);
|
|
|
}
|
|
|
|
|
|
// index 0~N
|
|
|
// rest 负~bag
|
|
|
public static int process(int[] w, int[] v, int index, int rest) {
|
|
|
if (rest < 0) {
|
|
|
return -1;
|
|
|
}
|
|
|
if (index == w.length) {
|
|
|
return 0;
|
|
|
}
|
|
|
int p1 = process(w, v, index + 1, rest);
|
|
|
int p2 = 0;
|
|
|
int next = process(w, v, index + 1, rest - w[index]);
|
|
|
if (next != -1) {
|
|
|
p2 = v[index] + next;
|
|
|
}
|
|
|
return Math.max(p1, p2);
|
|
|
}
|
|
|
|
|
|
public static int dp(int[] w, int[] v, int bag) {
|
|
|
if (w == null || v == null || w.length != v.length || w.length == 0) {
|
|
|
return 0;
|
|
|
}
|
|
|
int N = w.length;
|
|
|
int[][] dp = new int[N + 1][bag + 1];
|
|
|
for (int index = N - 1; index >= 0; index--) {
|
|
|
for (int rest = 0; rest <= bag; rest++) {
|
|
|
int p1 = dp[index + 1][rest];
|
|
|
int p2 = 0;
|
|
|
int next = rest - w[index] < 0 ? -1 : dp[index + 1][rest - w[index]];
|
|
|
if (next != -1) {
|
|
|
p2 = v[index] + next;
|
|
|
}
|
|
|
dp[index][rest] = Math.max(p1, p2);
|
|
|
}
|
|
|
}
|
|
|
return dp[0][bag];
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
int[] weights = { 3, 2, 4, 7, 3, 1, 7 };
|
|
|
int[] values = { 5, 6, 3, 19, 12, 4, 2 };
|
|
|
int bag = 15;
|
|
|
System.out.println(maxValue(weights, values, bag));
|
|
|
System.out.println(dp(weights, values, bag));
|
|
|
}
|
|
|
|
|
|
}
|