背包问题的动态规划算法和fptas
2017-12-28 21:38
1291 查看
背包问题
instance:给定n个item,i=1,2,…,n; weights w1,w2,…,wn∈Z+; values v1,v2,…,vn∈Z+, 给定背包容量B∈Z+;需要找到一个集合S∈{1,2,…,n} 让背包里面的东西value最大。
1.贪心算法
根据viwi的大小排序,每次放进去性价比高的item,直到不能放为止。
2.动态规划
定义:
A(i,v)代表从s∈{1,2,…,i}里找到价值为v的最小的w和;如果这个集合s找不到,那么+∞.
显然我们有:
A(i,v)=min{A(i−1,v),A(i−1,v−vi)+wi}
接下来我们就可以填表格似的求出max v such that A(n,v)≤B.
接下来分析这个算法,这个算法需要填的表的大小是n×V,其中V=∑ni=1vi,因此这个算法时间复杂度是O(n×V).
问题的规模是n的,V不是n的多项式,所以这个算法不是polynomial time的。这个是伪多项式时间的算法。
3.fptas(Fully Polynomial-Time Approximation Scheme)
完全多项式时间近似方案。就是无论多小的ϵ,都能够找到一个多项式时间的算法使得它的approximation ratio>1−ϵ,(或者小于1+)。
对于这个背包问题,我们可以观察到伪多项式算法只是由于V不是多项式的,因此可以把V化成n的多项式相关的,令:
v̂ i=⌊viK⌋
然后利用动态规划算法,求出这个新v̂ 集合的收益最大的集合Ŝ . 假设opt最优的集合为O
显然有:
∑i∈Ŝ v̂ i≥∑i∈Ov̂ i
so:
K×∑i∈Ŝ v̂ i≥K×∑i∈Ov̂ i
又有:
⌊viK⌋>viK−1
So:
K×v̂ i>vi−K
So:
K×∑i∈Ov̂ i=∑i∈OK×v̂ i≥∑i∈O(vi−K)≥opt−nK
if we want:
solopt>1−ϵ
then we want:
opt−nKopt≥1−ϵ
then:
n×Kopt≤ϵ
我们只需要找到opt的最小值即可。
那么opt显然是大于能放进这个背包中的物体中最大的那一个价值的。
记为P
Then:
K=ϵ×Pn
分析一下它的时间复杂度:
∑i∈Sv̂ i=∑i∈S⌊vi/K⌋<⌊∑i∈Svi/k⌋
And:
∑i∈Svi/P<n
Then:
v̂ <n×nϵ
因此时间复杂度为:O(n3/ϵ)
相关文章推荐
- [算法]背包问题的动态规划算法解答,C语言实现
- 01背包问题的动态规划算法、蛮力法和空间优化算法
- 背包问题的动态规划算法
- 0/1背包问题的动态规划算法
- 动态规划算法求解0,1背包问题
- 用动态规划算法的变形方法——备忘录方法,解决0-1背包问题
- 数据结构与算法学习之路:背包问题的贪心算法和动态规划算法
- 0-1背包问题的两种动态规划算法思想
- 01背包问题动态规划算法
- 01背包问题的动态规划算法
- 动态规划算法-背包问题
- 动态规划算法解0-1背包问题
- 算法导论答案 16.2-2 0-1背包问题的动态规划算法
- 动态规划算法,背包问题
- 0/1背包问题 - 以 动态规划算法 去解
- 背包问题——动态规划算法详解与实例
- 动态规划算法分析及实例——求解完全背包问题(java实现)
- 动态规划算法解决0-1背包问题
- 每天一道算法题(一) (动态规划算法)背包问题Java实现
- 0-1背包问题动态规划算法