揹包問題 01揹包總結

2021-08-25 08:34:26 字數 1437 閱讀 5223

寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。

在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,『

只要懂了這個圖,我想01揹包就不成問題了。

首先要明確這張表是至底向上,從左到右生成的。

關於01揹包的題目暫時整理了一點。

1.簡單01揹包:

2.01揹包+思維。poj 3628 bookshelf 2(dp:01揹包)

要考慮到一共價值是s,那麼選擇的s-h的揹包中價值最大maxx,然後用s-h-maxx就是多出h的那一小部分最小,因為總和是一定的所以一定可以裝滿h+多出的一小部分。

3.hdu 2546飯卡(dp:01揹包)

思路就是讓總容量-5(因為餘額大於5才能買乙個最大的)求個揹包,再減掉最大的物品。

4.robberies(01揹包+概率)

把銀行的錢當做揹包,把概率當做價值,總容量為所有銀行的總錢數,求不超過被抓

概率的情況下,最大的揹包容量是多少

dp[j] = max(dp[j],dp[j-bag[i].v]*(1-bag[i].p))(dp[j]表示在被搶概率j之下能搶的錢);

5.沒看懂。。。貪心+揹包。

***6.   01揹包+按照揹包的順序輸出路徑。

uva 624 cd(dp:01揹包)

可以這麼想,每乙個揹包都跟能容納他的容量有聯絡,用vis進行標記。

然後每乙個東西都判斷一下跟當前選的東西有無影響。

7.揹包+思維

uva 562  dividing coins(dp:01揹包)

就是怎麼分兩堆硬幣,使得兩堆差值最小。以sum/2為揹包容量得解。

8.思維poj3211(washing clothes + 0/1揹包)

sum/2的思想:

9.hdu 1203- i need a offer!(概率)(反著想)

這道題讓求得到至少得到乙份offer的最大概率,直接對這個問題進行處理有些麻煩,那麼我們可以通過算出乙份offer也拿不到的最小概率,通過概率和是1我們就可以得到要求的答案了,跟搶劫那一題比較像,概率是相乘而不是相加

***10.poj 1837 balance(感覺這道題跟揹包沒關係。。。)(好題!)

11.好題!二維揹包

題意:有商品個數限制的揹包問題。

在普通的揹包問題上再開一維表示已經買了的商品的個數。dp[i][j][k]表示前i個物品,花費為j,已經買了k個商品的最大價值。

轉移方程為:

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

揹包問題總結 01揹包 完全揹包 多重揹包

1 01揹包問題 有n個物品,每個物品只有一件。動歸方程 1 二維陣列解法 dp i j max 2 一維陣列解法 dp j max 附 hdu 2602 bone collector 二維陣列 include include int dp 1005 1005 int main else dp i ...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...