昨天小小总结了01背包:01背包 不足之处还望多提意见~噶呜~

今天来总结一下完全背包:

完全背包:

   基本思路:类似于01背包,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,策略已经不是取与不取两种,而是取0件,取1件,..等很多种,如果仍按01背包的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,仍可按照每种物品的不同策略写出状态转移方程,like this:f[i][v]=max(f[i-1][v-k*c[i]]+k*w[i]);

      for i← to N

          do for j← to V

              do for k← to j/C[i]

                 if(j >= k*C[i])

                      then F[i][k] ← max(F[i][k],F[i-][j-k*C[i]]+k*W[i])

      return F[N][V]

一个简单的优化:

若两件物品i,j满足c[i]<=c[j]&&w[i]>=w[j],则将物品j去掉不用考虑。 这个筛选过程如下:先找出体积大于背包的物品直接筛掉一部分(也可能一种都筛不掉)复杂度O(N)。利用计数排序思想对剩下的物品体积进行排序,同时筛选出同体积且价值最大的物品留下,其余的都筛掉(这也可能一件都筛不掉)复杂度O(V)。整个过程时间复杂度为O(N+V)

转化成01背包问题求解:

    因为同种物品可以多次选取,那么第i种物品最多可以选取V/C[i]件价值不变的物品,然后就转化为01背包问题。整个过程的时间复杂度并未减少。如果把第i种物品拆成体积为C[i]×2k价值W[i]×2k的物品,其中满足C[i]×2k≤V。那么在求状态F[i][j]时复杂度就变为O(log2(V/C[i]))。整个时间复杂度就变为O(NVlog2(V/C[i]))

时间复杂度优化为O(NV)的算法:

这个算法使用一维数组:

for i:1 to N

do for v:0 to V

do f[v]=max{f[v],f[v-cost]+weight}

你会发现这个伪代码和01背包的伪代码只有v循环次序不同,为什么01背包要按照V=v~0来循环呢?这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来,这正是为了每件物品只选一次保证在考虑“选入第i件物品”这件策略时依据的是一个绝无已经选入第i件物品的子结果f[i-1][v-c[i]],而现在完全背包的特点是每件物品可选无数件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i件物品的子结果:f[i][v-c[i]].

值得一提:

上面伪代码的两层for循环的次序可以颠倒,这个结论可能回来来算法时间常数上的优化。

总结:完全背包也是相当基础的背包问题,有上述两个状态转移方程。吾不才,希望多提意见~噶呜~

随机推荐

  1. 国产CPU走到十字路口:谁来取代英特尔芯片?(少写了一个OpenPower)

    国内的几支CPU研发力量各自选择的指令体系都有自己的优点和问题,选择其中的哪一支都会有对应的成本和风险.最终谁能担大任,且拭目以待. 文 | 瞭望智库特约科技观察员 王强 用上内置国产CPU的个人电脑 ...

  2. Mac编程的官方文档(类似MSDN)

    https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammin ...

  3. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  4. Ubuntu 14.04下安装GitLab指南

    摘要 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 在GitLab的官方网站上面对Ubuntu的支持也是很好的,有比较详尽的安装指南. ...

  5. Windows Azure 网站的 IP 和域限制

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. 配置 Azure 网站 (WAWS) 的 IP 和域限制一直是用户最迫切希望我们提供 ...

  6. 给你的Cordova HybridApp加入Splash启动页面

    如今最新的Cordova 3以上的版本号支持启动画面了,是通过cordova插件实现的. 眼下Splash插件支持android,ios,blackberry等多个平台. 加入插件等步骤例如以下: 加 ...

  7. QQ登录-第三方SDK的接入总结

    由于项目的需要,使用了[QQ登录]SDK 的相关功能!   1.集成[QQ登录]SDK   [QQ登录]SDK下载地址: http://wiki.open.qq.com/wiki/website/SD ...

  8. 云计算:创业的好时机——上海够快网络科技有限公司总经理蒋烁淼专访(评价阿里云的OSS的4个优点)(够快科技正式宣布已成功挂牌新三板)

    云存储是云计算目前的热点之一,Dropbox.Box等产品的风靡,公司因此获得极高估值,都印证了这一点.但云存储对技术和资金要求都比较高,竞争也非常激烈,挑战巨大.国外云存储公司有亚马逊的云平台作为支 ...

  9. delphi高手突破学习笔记之面向对象类和对象的本质(有汇编解释 good)

    知识点1:堆和栈 每个应用程序可以获得的内存空间分为两种:堆(heap)和栈(stack). 堆又称为“自由存储区”,其中的内存空间的分配与释放是必须由程序员来控制的.例如,用GetMem函数获取了一 ...

  10. innerHeight与clientHeight、innerWidth与clientWidth、scrollLeft与pageXOffset等属性

    区分innerHeight与clientHeight.innerWidth与clientWidth.scrollLeft与pageXOffset等属性 标签: innerheight clienthe ...