如果你真的想讨论这个问题,应该去算法版
【 在 townhope 的大作中提到: 】
以下是Java代码
static int[] values = new int[] {894, 260, 392, 281, 27};
static int[] weights = new int[] {8, 6, 4, 0, 21};
static int W = 30;
private static int knapsack(int i, int W) {
if (i < 0) {
return 0;
}
// 如果装不下
if (weights[i] > W) {
return knapsack(i-1, W);
} else { // 如果装得下
int reslut1 = knapsack(i-1, W); // 如果不偷
int reslut2 = knapsack(i-1, W - weights[i]) + values[i]; // 如果偷
return Math.max(reslut1, reslut2);
}
}
public static void main(String[] args) {
System.out.println(knapsack(values.length - 1, W));
}
==
请问, Math.max(reslut1, reslut2);是什么意思?
上一步的状态 knapsack(i-1, W)
i 表示从n -1到 n-2, n-3, ..., 3, 2, 1,0 的第i件物品
W表示 当前背包剩余容量
knapsack(i-1, W) 表示 当前背包总价值
下一步的状态由上一步推算出来。
如何从knapsack(i-1, W) 得到 knapsack(int i, int W) ?
假设小偷处在第n步 利用递归 假设已经有了第n-1步的结果:
1 先考虑装不装得下
2 再考虑偷不偷
如果装不下 则维持上一步的状态不变 knapsack(i-1, W)
如果装得下
两种选择
1. 不偷 则维持上一步的状态不变 knapsack(i-1, W)
2. 偷 则,
当前背包剩余容量 - weights[i]
当前背包总价值 + values[i]
即
W - weights[i]
knapsack(i-1, W) + values[i]
综合起来就是 knapsack(i-1, W - weights[i]) + values[i]
然后比较偷和不偷的两种结果,取较大的一个。
这里百思不得其解: 如果装得下,为什么不偷? 难道不偷还能比偷得总价更高? 这里取Math.max(reslut1, reslut2)作何解释?
--
FROM 123.118.102.201