int n = 5;// 5件物品,物品编号为a,b,c,d,e(下面为多加一件物品,第一个物品为虚拟的物品) int weight[] = { 0, 4, 5, 6, 2, 2 };// 物品的重量 int value[] = { 0, 6, 4, 5, 3, 6 }; // 对应物品的价值 int c = 10; // 背包容量 int state[] = { 0, 0, 0, 0, 0, 0 };// 开始状态 char name[] = { ' ', 'a', 'b', 'c', 'd', 'e' }; int maxValue = getMaxValue(n, weight, value, state, c); System.out.println("最大价值为 = " + maxValue); System.out.print("放入的物品为 :"); for (int i = 1; i <= 5; i++) { if (state[i] == 1) { System.out.print(name[i] + " "); } }
// System.out.println(); }
/** * * @param n * 物品数量 * @param weight * 物品对应重量(数组下标从0开始,故第一个物品为虚拟物品) * @param value * 物品对应价值(数组下标从0开始,故第一个物品为虚拟物品) * @param state * 物品的开始状态 * @param c * 背包的容量 * @return */ public static int getMaxValue(int n, int weight[], int value[], int state[], int c) { // n 为物品的数量,数组时需要加 1,此时可以从 0,1,...n 个物品,共 n+1 个商品,其中第 0 个为虚构物品 // 对于物品的价值,可以写成 2 维数组 int m[][] = new int[n + 1][c + 1]; // n 为 0,1,2...(n-1),背包重量为 0,1,2...C int i, j;
for (i = 0; i <= n; i++) { m[i][0] = 0; } for (j = 0; j <= c; j++) { m[0][j] = 0; }