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̂
nϵ
因此時間複雜度為: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。每種物品只有乙個 問 如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?面對每個物品,我們只有選擇放入或者不放入兩種選擇,每種物品只能放入一次。我們用之前同樣的思路來走一遍試試 假設只剩下最後一件物品,我們有兩種選擇 ...