超大背包问题

本文介绍了如何解决超大背包问题,其中物品数量n和重量、价值限制在一定范围内。传统完全背包算法因复杂度过高不适用,于是提出采用折半枚举结合二分查找的方法,以降低时间复杂度至O(2^(n/2)*n),使得问题在有限时间内可解。
摘要由CSDN通过智能技术生成

超大背包问题:
有重量和价值分别为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的字典序排序后简单做到

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值