dp之背包问题(下)
多重背包
朴素版本(O(n * v * s))
1 |
|
优化版本: 二进制优化
二进制优化,它为什么正确,为什么合理
分析:
如果直接遍历转化为01背包问题,是每次都拿一个来问,取了好还是不取好。那么根据数据范围,这样的时间复杂度是O(n3)也就是109109,这样是毫无疑问是会TLE的。
所以需要用二进制进行分堆取,这里我看到一个很棒的解释,引用一下
取这样一个例子:要求在一堆苹果选出n个苹果。我们传统的思维是一个一个地去选,选够n个苹果就停止。这样选择的次数就是n次
二进制优化思维就是:现在给出一堆苹果和10个箱子,选出n个苹果。将这一堆苹果分别按照
1,2,4,8,16,.....512分到10个箱子里,那么由于任何一个数字x∈[0,1023](第11个箱子才能取到1024)都可以从这10个箱子里的苹果数量表示出来,但是这样选择的次数就是 ≤10次 。如果要拿1001次苹果,传统就是要拿1001次;二进制的思维,就是拿7个箱子就行(分别是装有512、256、128、64、32、8、1个苹果的这7个箱子),这样一来,1001次操作就变成7次操作就行了。
这样复杂度就降为
O(n^2 * logS)
1 |
|
分组背包

1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 mm1ord's blog!