博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
背包九讲-第三讲 多重背包
阅读量:4326 次
发布时间:2019-06-06

本文共 623 字,大约阅读时间需要 2 分钟。

题目

有一个容量为V的背包和N种物品,第i件物品的体积是c[i] 价值是w[i] 共有n[i]件,请给出一种策略使得装入背包中的物品价值最高.

基本算法

和完全背包问题类似,区别是完全背包每种物品的数量是无限的而多重背包是有限的.可以仿照完全背包写出状态转移方程:

f[i][v] = max(f[i-1][v-k*c[i]] + k*w[i] | 0<=k<=n[i])

转化为01背包

和完全背包类似,多重背包同样可以转化为01背包: 把第i种物品换成n[i]件01背包中的物品,则可以将多重背包转化为01背包.

仍然可以像完全背包一样通过二进制来降低复杂度,将第i种物品换成若干件物品,其中每件物品有一个系数表示这件物品的体积和价值均是原来的系数倍,这些系数分别是1,2,4···2^(k-1),n[i]-2^k+1,k满足2^k+1>n[i]

下面给出O(log amount)时间处理一件多重背包中物品的过程,其中amount表示物品的数量:

procedure MultiplePack(cost,weight,amount)    if cost*amount>=V        CompletePack(cost,weight)        return    integer k=1    while k

O(VN)的算法

转载于:https://www.cnblogs.com/lepeCoder/p/bag-3.html

你可能感兴趣的文章
base64编码的图片字节流存入html页面中的显示
查看>>
这个大学时代的博客不在维护了,请移步到我的新博客
查看>>
GUI学习之二十一——QSlider、QScroll、QDial学习总结
查看>>
nginx反向代理docker registry报”blob upload unknown"解决办法
查看>>
gethostbyname与sockaddr_in的完美组合
查看>>
kibana的query string syntax 笔记
查看>>
旋转变换(一)旋转矩阵
查看>>
thinkphp3.2.3 bug集锦
查看>>
[BZOJ 4010] 菜肴制作
查看>>
C# 创建 读取 更新 XML文件
查看>>
KD树
查看>>
VsVim - Shortcut Key (快捷键)
查看>>
C++练习 | 模板与泛式编程练习(1)
查看>>
HDU5447 Good Numbers
查看>>
08.CXF发布WebService(Java项目)
查看>>
java-集合框架
查看>>
RTMP
查看>>
求一个数的整数次方
查看>>
点云PCL中小细节
查看>>
铁路信号基础
查看>>