下面是本蒟蒻的一些個人理解,請見諒
眾所周知,01揹包有兩種初始化形式:
初始化為0,f[j
]f[j]
f[j]
表示不要求裝滿時揹包容積為j
jj的最大價值;
f [0
]f[0]
f[0]
初始化為0,f[1
−n
]f[1-n]
f[1−n]
初始化為−
∞- \infty
−∞,f [j
]f[j]
f[j]
表示恰好裝滿時揹包容積為j
jj的最大價值。
這是為什麼呢?
原理很簡單,此處,方法2中的−
∞- \infty
−∞可以理解為沒有滿足條件(即恰好裝滿)的最優解。
由於01揹包狀態轉移公式:
/*
n 物品數
m 揹包容積
v[i] 第i個物品的體積
w[i] 第i個物品的價值
f 狀態
*/for
(int i=
1;i<=n;i++
)for
(int j=m;j>=v[i]
;j--
) f[j]
=max
(f[j]
,f[j-v[i]
]+w[i]);
//狀態轉移方程
若一定要求裝滿:
for
(int j=
0;j<=m;j++
) ans=
max(ans,f[j]);
//因為不一定裝滿m
反之,同理,不要求裝滿即可賦初值為0,
直接輸出答案為f[m]
。
01揹包初始化要點
我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。有的題目要求 恰好裝滿揹包 時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了f 0 為0其它f 1.v 均設為 這樣就可以保證最...
揹包問題 初始化
初始化的細節問題 我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。有的題目要求 恰好裝滿揹包 時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了f 0 為0,其它f 1 v 均設...
01揹包的兩種初始化問題
前段時間看dp中的01揹包問題,大部分內容都好理解,網上也有很多關於這個問題的部落格,但自己提出的問題沒有得到解決,只好苦思冥想,以求進一步理解。首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選 擇裝入揹包中的物品 總價值最大?這裡有兩種情況一種是將揹...