著名的 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
步骤,但是我无法构建迭代式解决方案。我们怎么可能做到这一点呢?