完全揹包問題

2021-08-06 05:39:44 字數 1000 閱讀 7918

乙個資深小白的理解~~

引用最常見的問題:有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

與01揹包不同的是每種物品可以取多次,

01揹包的狀態方程是f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i];

完全揹包的狀態方程是

f[i][j]=max可見,當k=0和1時就是01揹包的狀態方程。

對於這個狀態方程需要關於i,j,k的三重迴圈。

關於優化問題:化簡狀態方程f[i][j]=max

=max(f[i-1][j],max)=max(f[i-1][j],f[i][j-w[i]]+v[i])

若兩件物品滿足c[i] ≤c[j]&&w[i] ≥w[j]時將第j種物品直接篩選掉。因為第i種物品比第j種物品物美價廉,用i替換j得到至少不會更差的方案。

這個篩選過程如下:先找出體積大於揹包的物品直接篩掉一部分(也可能一種都篩不掉)複雜度o(n)。利用計數排序思想對剩下的物品體積進行

排序,同時篩選出同體積且價值最大的物品留下,其餘的都篩掉(這也可能一件都篩不掉)複雜度o(v)。

整個過程時間複雜度為o(n+v)

時間複雜度優化為o(nv)

設f[i][j]表示出在前i種物品中選取若干件物品放入容量為j的揹包所得的最大價值。那麼對於第i種物品的出現,我們對第i種物品放不放入揹包

進行決策。如果不放那麼f[i][j]=f[i-1][j];如果確定放,揹包中應該出現至少一件第i種物品,所以f[i][j]種至少應該出現一件第i種物品,

即f[i][j]=f[i][j-c[i]]+w[i]。為什麼會是f[i][j-c[i]]+w[i]?因為我們前面已經最大限度的放了第i件物品,如果能放就放這最後的一件,

(或者理解為前面已經往揹包中放入了第i件物品,我們每一次只增加一件的往揹包裡放,而且只能增加一件,多了放不下)

狀態方程為:

關於空間優化 稍後再補

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

完全揹包問題

這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...

完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...