DP 揹包專題 揹包九講

2022-08-03 08:24:12 字數 2243 閱讀 9391

這段時間看了《揹包九講》,在hust vjudge上找到了乙個題單,挑選了其中16道題集中做了下,選題全部是hdu上的題,大多是簡單題。目前做了點小總結,大概提了下每道題的思路重點部分,希望以後回看回想時能有幫助。

題單:hdu 1059、hdu 1114、hdu 1171、hdu 1203、hdu 1712、hdu 2159、

hdu 2191、hdu 2546、hdu 2602、hdu 2639、hdu 2844、hdu 3033、

hdu 3449、hdu 3466、hdu 3535、hdu 3810

0-1 揹包:hdu 1059、hdu 1203、hdu 2546、hdu 2602、hdu 3466

完全揹包:hdu 1114

多重揹包:hdu 1171、hdu 2191、hdu 2844

混合揹包:hdu 3535

二維揹包:hdu 2159

分組揹包:hdu 1712、hdu 3033

有依賴揹包:hdu 3449

揹包問題變化:hdu 2639、hdu 3810

0-1揹包問題,直接套上兩層迴圈即可。

注意需要將 dp[j - cost[i]] + val[i] 改為 dp[j - cost[i]] * val[i]。

0-1揹包問題。

首先用5元買最貴的東西,然後剩下的做普通0-1揹包即可。

0-1揹包基礎入門題。

需要注意的是,如果要求恰好裝滿揹包則除dp[0]外所有都需要初始化為-∞,這樣可以保證最終狀態f[n]是恰好裝滿揹包的狀態最優解。

如果沒要求揹包恰好裝滿,只希望**盡量大,此時應將整個dp陣列初始化為0。

0-1揹包問題。

給入物品要按照**p和**限制q對q - p進行從小到大排序。解釋如下:

對任意兩個物品,a:p1, q1 b:p2, q2。先選a,則至少需要剩餘p1 + q2的容量才能將兩個物品買下,而先選b則至少需要p2 + q1,如果p1 + q2 > p2 + q1,那麼要選兩個的話的就要先選a再選b,公式可換成q1 - p1 < q2 - p2,就按這樣的方法排序最後的順序就是最優的順序。

完全揹包入門問題。

本題求得是最小值,所以初始化時除dp[0] = 0外其餘全部為+∞。

多重揹包基本問題。

需要二進位制優化下,不然會超時。

多重揹包問題。

因為小的一方獲得總價值最多為sum / 2,所以dp範圍是0~sum/2。然後二進位制優化下按照0-1揹包做。

多重揹包入門問題。

直接套揹包九講。

多重揹包問題。

直接套揹包九講。注意二進位制優化。

混合揹包問題。

詳細題解見:

二維揹包問題。

dp[i][j]表示忍耐度為i,且還可以殺j個怪時能獲得的最大經驗值。

分組揹包入門問題。

直接套揹包九講。

分組揹包變種問題。

普通分組揹包是每組中最多取一件,這裡是至少取一件。

dp[i][j]代表前i組容量為j的最大價值。由於一組裡面有多個物品,所以狀態轉移可以是前一組少取乙個,即dp[i - 1][p - cost[i][j]] + val[i][j],也可以是當前組之前去過的少取一種,即dp[i][p - cost[i][j]] + val[i][j]。

這裡需要注意下兩個情況的先後順序,需要先進行當前組的比較再與前一組進行比較(即單純的分組揹包必選情況,特別的是物品有0花費的情況,0花費要先放在當前層,再放在上一層才不會買兩次,即先買0花費的)。

注意初始化時除dp[0]一行外全部為-∞,因為是恰好從上一組轉移到這一組。

依賴揹包問題。

題中買相應物品必須買相應箱子,箱子即依賴。在做0-1揹包時需要先將box的影響除去,即在做0-1揹包前先dp2[j] = dp[j - box[i]],更新列舉起點即可。在0-1揹包做完後將dp與dp2中的最優值放入dp中即可。

求0-1揹包的第k大解。

對於一般的揹包方程為f[i-1][v] = max( f[i-1][v], f[i-1][v - cost[i]] + val[i] ),因為要記錄第k大解,我們必然要記錄前k大的所有解。所以我們從有序佇列f[i-1][v][1...k]和f[i-1][v - cost[i]][1...k] + val[i]兩個序列合並且取前k大不重複值存入f[i][v][1...k]中。實現過程中可以做滾動陣列優化。時間複雜度為o(vnk)。

0-1揹包變種問題。

詳細題解見:

個人認為揹包九講中最基礎最重要的兩個模型是0-1揹包模型和完全揹包模型,把這兩個模型弄懂了多摳細節,後面的模型理解起來會輕鬆很多。

揹包九講專題 混合揹包

不優化樸素解法,01揹包看出s 1,完全揹包看成s inf,再跑多重揹包 時間複雜度高,3層for迴圈 includeusing namespace std const int maxn 1e3 5 int dp maxn intv maxn w maxn s maxn intmain for in...

揹包九講專題 01揹包

樸素2維無優化寫法 includeusing namespace std const int maxn 1e3 5 int dp maxn maxn v maxn w maxn intmain printf d n dp n m view code 優化1維寫法 關於優化是怎麼來的?首先為什麼第二個...

DP 揹包九講之01揹包

有n件物品和乙個容量為v 的揹包。放入第i件物品耗費的空間是ci,得到 的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不 放。用子問題定義狀態 即f i,v 表示前i件物品恰放入乙個容量為v的揹包可以 獲得的最大價值。則其狀態轉移方...