【发布时间】:2020-05-09 21:38:15
【问题描述】:
著名的0/1 背包问题侧重于在给定的Weight (W) 中获得最大成本/价值。
上面的代码是这个::
n = cost_array / weight_array size
INIT :: fill 0th col and 0th row with value 0
for (int i=1; i<=n; i++) {
for (int j=1; j<=W; j++) {
if (weight[i-1] <= j) {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i-1]] + cost[i-1]);
}else {
dp[i][j] = dp[i-1][j];
}
}
}
回答 :: dp[n][W]
新问题 :: 所以,我们在这里计算最大成本/价值。但是如果我想找到最小的成本/价值怎么办(它仍然是有界的背包)。
我认为问题归结为我如何执行上述INIT 步骤。在循环中,我认为它会保持不变,唯一的区别是 Math.max 变为 Math.min
我用Infinity、0 等尝试了INIT 步骤,但无法构建迭代解决方案。
我们怎么可能做到这一点?
【问题讨论】:
-
只需将每个权重转换为负数,不要更改算法。
标签: dynamic-programming knapsack-problem