import java.util.Arrays;
/*
-
有 N 件物品和一个容量为 V 的背包,第 i 件物品的重量是 w[i],价值是 p[i]。
-
求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
-
假设 V=20,W={5,6,3,7,8},P={6,7,4,8,9},则最大价值为23
*/
public class 背包 {
public static void main(String[] args) {int N = 5; // 物品的种类 int V = 20; // 背包的容量 int[][] b = new int[N + 1][V + 1]; int[] w = { 0, 5, 6, 3, 7, 8 }; // 物品的重量,留一空位 int[] p = { 0, 6, 7, 4, 8, 9 }; // 物品价值,留一空位 int k, cap; // k表示第k个商品,cap表示背包最大容量 for (k = 1; k < N + 1; k++) { for (cap = 1; cap < V + 1; cap++) { if (w[k] > cap) { b[k][cap] = b[k - 1][cap]; // 如果第k件物品重量大于现有背包容量 // 则不装入背包 } else { // 背包容量够拿第k件物品 int valule1 = b[k - 1][cap - w[k]] + p[k];// 选择拿 int valule2 = b[k - 1][cap];// 选择不拿 if (valule1 > valule2) { b[k][cap] = valule1; } else { b[k][cap] = valule2; } } } } for (int i = 0; i < N + 1; i++) { System.out.println(Arrays.toString(b[i]));//返回指定数组内容 } System.out.println(b[N][V]);
}
}