超大背包问题:
有重量和价值分别为wi和vi的n个物品,从这些物品中挑选总重量不超过W的物品,
求所有挑选方案中价值总和最大值
限制条件:
1 <= n <= 40
1 <= wi, vi <= 10^15
1 <= W <= 10^15
输入:
n = 4;
w = {2, 1, 3, 2};
v = {3, 2, 4 , 2};
W = 5;
输出:
7(挑选0, 1, 3号物品)
这个就是经典的背包问题,但是这里的W非常大;
完全背包一元数组优化后是:
for (i ~ n) {
for (v ~ W {
....
}
}
可见算法复杂度是O(n*W) ,因此不能用来解决这个问题:
所以可以枚举:
但是我们考虑到n种物品枚举就有2^n种;就太大了;
此时可以采用------------折半枚举
因此2^20的数量级还是可以接受 的;
我们可以把前半部分对应的重量和价值记为w1, v1, 在后半部分寻找总重w2<=W-w1使v2最大的选取方案就好了
为了在集合(w2, v2)中高效寻找max{v2|w2<=W'}的方法,显然我们可以排除所有w2[i]<=w2[j]并且v2[i]>=v2[j]的j;
这点可以用按照w2,v2的字典序排序后简单做到
超大背包问题
最新推荐文章于 2022-10-07 10:19:28 发布
本文介绍了如何解决超大背包问题,其中物品数量n和重量、价值限制在一定范围内。传统完全背包算法因复杂度过高不适用,于是提出采用折半枚举结合二分查找的方法,以降低时间复杂度至O(2^(n/2)*n),使得问题在有限时间内可解。
摘要由CSDN通过智能技术生成