我正在尝试使用非整数值减少 Knapsack DP 算法所需的时间和空间。
http://en.wikipedia.org/wiki/Knapsack_problem#Meet-in-the-Middle_Algorithm
In particular, if the [elements] are nonnegative but not integers, we could
still use the dynamic programming algorithm by scaling and rounding (i.e. using
fixed-point arithmetic), but if the problem requires fractional digits of
precision to arrive at the correct answer, W will need to be scaled by 10^d,
and the DP algorithm will require O(W * 10^d) space and O(nW * 10^d) time.
DP 背包算法使用 [ nx W ] 矩阵,用结果填充它,但有些列永远不会被填充 - 它们不匹配对象权重的任何组合。这样,它们最终只会在每一行上填充零,只是浪费时间和空间。
如果我们使用哈希数组而不是矩阵,我们可以减少所需的时间和空间。
edit:
knapsack capacity = 2
items: [{weight:2,value:3} ]
[0 1 2]
[0 0 0]
2: [0 0 3]
^
Do we need this column?
Substitution with hash:
2: {0:0, 2:3}
在 Python 中,dict 插入有一个 O(n) 更坏的情况和一个 O(1) 的“摊销”线性时间。
我错过了什么吗?
背包 DP 算法的这种变化的复杂性是多少?