完全背包問題


完全背包問題

有N 種物品和一個容量為V 的背包,每種物品都有無限件可用。放入第i 種物品的費用是Ci,價值是Wi。求解:將哪些物品裝入背包,可使這些物品的耗費的費用總和不超過背包容量,且價值總和最大。

現在的問題在於每個物品都有無限種,因此不能像01背包那樣決定i物品放或者不放,因為放的話有多種可能,0件,1件,2件......

現在回顧01背包里的一維dp:

 

 之所以01背包能縮小到一維dp,是因為我們考慮i的放與不放時,dp[j]與dp[j-Ci]都必須是在i-1的狀態下,也就是說是i-1個物品放入j容量背包和i-1個物品放入j-Ci個物品的最大值問題。如果采用逆序,當進行到j時,由於j-Ci<j,因此還沒更新,dp[j-Ci]還表示的是i-1時刻的狀態。而如果采用正序的方式,當進行到j時,dp[j-Ci]已經更新了,表示的已經是i時刻的狀態了,因此不能采用正序。

而在完全背包中,當我們考慮i物品時,如果不放1件,也就是說只有0~i-1這幾種物品往j容量背包里放,這個狀態下的最大值是dp[j],是i-1時刻的狀態。而如果放,由於要考慮放1件,2件還是3件。。。。,因此不能使用i-1時刻的狀態了,因為i-1時刻的狀態中只有0~i-1共i種物品,而我們現在已經確定要放了,因此必須要是i時刻下的背包,也就是說dp[j-Ci]此時必須處於i時刻,而不能是i-1時刻。

因此,完全背包實際上只要調整內循環的次序就可以解決了:

 

 這樣,當進行到(i,v)時,由於還未更新,F[v]表示容量v的背包里放0~i-1種物品的最大價值,也就是不放第i種物品。而當我決定i物品一定要放進去時,此時占去一個位置,則只要知道F[v-Ci]的最大值就好了,而F[v-Ci]必須表示i時刻下的背包最大價值,因為在遞增到v之前,i物品也是要可以放入背包的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM