揹包問題的動態規劃演算法和fptas

2021-08-14 04:27:16 字數 1565 閱讀 7421

instance:給定n個item,i=

1,2,

…,n ; weights w1

,w2,

…,wn

∈z+ ; values v1

,v2,

…,vn

∈z+ , 給定揹包容量b∈

z+;

需要找到乙個集合s∈

讓揹包裡面的東西value最大。

1.貪心演算法根據v

iwi 的大小排序,每次放進去價效比高的item,直到不能放為止。

2.動態規劃

定義:a(i

,v) 代表從s∈

裡找到價值為v的最小的w和;如果這個集合s找不到,那麼+∞

.顯然我們有:a(

i,v)

=min

接下來我們就可以填**似的求出max v such that a(

n,v)

≤b.接下來分析這個演算法,這個演算法需要填的表的大小是n×

v ,其中v=

∑ni=

1vi ,因此這個演算法時間複雜度是o(

n×v)

.問題的規模是n的,v不是n的多項式,所以這個演算法不是polynomial time的。這個是偽多項式時間的演算法。

完全多項式時間近似方案。就是無論多小的ϵ

>1−

ϵ ,(或者小於1+)。v̂ 

i=⌊v

ik⌋

然後利用動態規劃演算法,求出這個新v̂ 

集合的收益最大的集合ŝ 

. 假設opt最優的集合為o

顯然有:∑i

∈ŝ v

̂ i≥∑

i∈ov

̂ iso:k×

∑i∈s

̂ v̂ i

≥k×∑

i∈ov

̂ i

又有:⌊vi

k⌋>vi

k−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:so

lopt

>1−

ϵ then we want:op

t−nk

opt≥

1−ϵ

then:n×

kopt

≤ϵ

我們只需要找到opt的最小值即可。

那麼opt顯然是大於能放進這個揹包中的物體中最大的那乙個價值的。

記為pthen:k=

ϵ×pn

分析一下它的時間複雜度:∑i

∈sv̂ 

i=∑i

∈s⌊v

i/k⌋

<⌊∑

i∈sv

i/k⌋

and:∑i

∈svi

/pthen:v̂ 

因此時間複雜度為:o(

n3/ϵ

)

01揹包問題 (動態規劃演算法)

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波 面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...

動態規劃演算法 03揹包問題

問題描述 問題分析 首先考慮乙個有前i 1 i n 個物品定義的例項,物品的重量分別為w1,w2,wi,價值為v1,v2,vi,揹包目前的承重量為j 1 j w 設f i,j 為組成該例項最優解的物品的總價值,也就是說能夠放進承重量為j的揹包中的前i個物品中最有價值的子集的總價值。注意,在這裡還沒有...

01揹包問題 (動態規劃演算法)

題目 給定n種物品和乙個容量為v的揹包,物品i的體積是wi,其價值為ci。每種物品只有乙個 問 如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?面對每個物品,我們只有選擇放入或者不放入兩種選擇,每種物品只能放入一次。我們用之前同樣的思路來走一遍試試 假設只剩下最後一件物品,我們有兩種選擇 ...