題解 01揹包

2021-09-22 21:35:36 字數 1661 閱讀 4767

描述

乙個旅行者有乙個最多能裝 m 公斤的揹包,現在有 n 件物品,它們的重量分別是w1,w2,…,wn,它們的價值分別為c1,c2,…,cn,求旅行者能獲得最大總價值。

輸入第一行:兩個整數,m(揹包容量,m≤200)和n(物品數量,n≤30);

第2…n+1行:每行二個整數wi,ci,表示每個物品的重量和價值。

輸出僅一行,乙個數,表示最大總價值。

輸入樣例 1

10 4

2 13 3

4 57 9

輸出樣例 1

12**

一本通

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.好題!二維揹包

hdu 3496 watch the movie

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

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

轉移方程為:

#includeusing namespace std;

int w[1000],v[1000],dp[100000];

int main()

for(int i=1;i<=n;i++)

} cout<

return 0;

}

01揹包 題解

略略 我們的狀態陣列f i j f i j f i j 指在揹包有j jj的容量,只有前i ii件物品時的最大價值 由於每種物品只有選與不選兩種情況 所以如果容量允許,那麼f i j f i j f i j 只有兩種選擇 選擇第i ii件物品,或不選 狀態轉移方程見 然鵝,我們可以使用一些奇妙的手段...

Dima and Salad 題解 01揹包變形

給你n個物品,每個物品有兩個值乙個為a,乙個為b 要你拿任意的物品使得 sum a sum b k 且max sum a 1 n 100 1 k 10 1 a i b i 100 乙個顯然易見的思路設 dp i j 為是否有 sum a i sum b j 然後最後複雜度為 o 1e10 顯然不行 ...

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...