1. 程式人生 > >蒟蒻吃藥計劃-治療系列 #round 3 背包問題大集合

蒟蒻吃藥計劃-治療系列 #round 3 背包問題大集合

width 治療 這就是 image clas gpo 在一起 啊啊啊 應該


序:部分背包

這一部分的內容是大家再熟悉不過的了

我舉個栗子,金銀島

我想學過貪心的差不多都做過這道題

這一類問題有一個特點,就是物品可以分割(或者是可以選擇物品的局部)

作為#round 3的序,我希望看過這篇博文的人能夠認清這一類問題與後面的各類背包問題的區別


1.01背包

愉快的吃藥就從現在開始啦!

按照套路,那個人應該出現了,不是麽?

技術分享圖片:哇,居然被你猜對了

我想,我寧願自己猜錯了

技術分享圖片:我今天又有一個問題,你能幫幫我嗎?

(內心:多少金幣?)

技術分享圖片:不過這次沒有金幣。

(我是拒絕的)什麽問題?

技術分享圖片:我今天又去了超市,看中了一些喜歡的東西,想全部買下來,錢是夠,可是發現好像帶不了那麽多,我想請你幫幫忙,看看我怎樣才能獲得最大的價值。

巧了,這不是今天學的背包麽?

哈哈,正好能夠大顯身手了,我們跟他去看看吧

(超市)

技術分享圖片:你看,就是這些,這些,還有這些,哦對了,還有那些……

哇,這東西好像有點多,不過每個都只有一件,我們可以好好地看一看,幫他解決

我們看看啊:

商品名稱 棗藥丸 鍵盤 筆記本(不是電腦) 鵲巢牌咖啡 WEY神犇親筆簽名
重量 1 3 2 1 1
價值 5 8 1 2 99999999999

技術分享圖片:我最多能帶總重量$\leqslant3$的東西,超過就帶不走了,啊啊啊啊啊啊啊啊啊啊啊我都想要啊……

我們先不理他,自己分析一下這道題目

恩...應該就是讓我們在這裏面選出一些東西總重量在3以內的東西,並使得它們的價值最大

這擺明了一個01背包嘛!我們就套進來試試吧

先設一個$w和c$兩個數組用$w[i]$表示價值,用$c[i]$表示重量

再設一個$dp$二維數組並使$dp[i][j]$表示前$i$件物品正好放入容量為$j$的背包能夠獲得的最大價值

我們得到了兩種不同的選擇

一種是選擇不放這個物品$dp[i][j]=dp[i-1][j]$

另一種是選擇放這個物品$dp[i][j]=dp[i-1][j-c[i]]+w[i]$

然後把兩個弄在一起,取最大值$max(dp[i-1][j],dp[i-1][j-c[i]]+w[i])$

這就是狀態轉移方程了~

順便把邊界條件弄出來

$dp[0][0]=0$

$dp[i][j]=-INF$

蒟蒻吃藥計劃-治療系列 #round 3 背包問題大集合