Cmpletepack coming~^.^
昨天小小总结了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循环的次序可以颠倒,这个结论可能回来来算法时间常数上的优化。
总结:完全背包也是相当基础的背包问题,有上述两个状态转移方程。吾不才,希望多提意见~噶呜~
随机推荐
- CCIE路由实验(5) -- BGP负载均衡
enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t 0 0exitline vty 0 4pass ciscologg ...
- 用CentOS,fedora等访问局域网中的Windows共享
来到Linux世界中已有一段时间了,感觉上好像自己的电脑成了一个孤岛.周围的人都还是用Windows系统,能相互共享文件,我用Linux系统,别人的共享文件都还不知道怎么访问?通过网上查资料学习,现在 ...
- 【C/C++多线程编程之四】终止pthread线程
多线程编程之终止pthread线程 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 终止线程似乎是多线程编程的最后一步,但绝不是本系列教 ...
- sql server 实现sleep延时
sql server中实现与C++ 中Sleep类似的功能,可以使用 waitfor delay '00:00:00:10' 表示延时10毫秒
- 如何在Windows上配置EBS R12.1.3的OAF开发环境
1.找到想要开发的EBS OAF扩展对应的PATCH,可以参照下面的Note,因为我要做的是R12.1.3的开发,所以要下载p9879989_R12_GENERIC OA Framework - Ho ...
- SilkTest Q&A 12
111. 谁能告诉我,正在执行的SilkTest的log是存放在哪里? 答案1: 用下面的命令可以导出文本格式的log "c:/program files/segue/silktest/pa ...
- Python全栈开发
Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“ ...
- 基于visual Studio2013解决面试题之0709求方
题目
- 九度OnlineJudge之1014:排名
题目描述: 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后通过分数线的考生,并将他 ...
- python学习——截图工具编写
学习一门语言最好的方法便是实践,想要拿Python写一个截图工具,网上一搜资料果然已经很多,前辈们都已经做的很到位了.现在就一步步来学习一下: 首先学习截图整个桌面的方法,可以使用Python中的PI ...