對於0 1揹包的問題的初步了解

2021-09-11 18:53:24 字數 949 閱讀 6361

首先,我們通過乙個例題來看看。

題目的大概意思是,有乙個小偷拿著麻袋去商場偷東西,小偷的揹包大小為w(即小偷只能偷重量之和為小於等於w的物品),商場裡有如下**種類的物品分別對應物品的重量和對應物品的**,問小偷能偷到的物品的**之和最大為多少?

標號重量(wk)

**(vk)12

3234

3454

5859

10為了方便起見,我們將物品的標號從1開始。

我們用乙個二維陣列b[k][c]來記錄當前偷到的**(其中k表示前k個物品,c表示剩下多少空間)。我們很容易發現,當第k件物品太重(wk>c)時無法偷走,這時候b[k][c]=b[k-1][c]。當第k件物品沒有那麼重可以放進包裡的時候,這時候我們要考慮,偷還是不偷的問題,這個時候我們就要比較是偷了的價值大,還是不偷的價值大,那麼顯然,b[k]=max(b[k-1][c-wk]+vk,b[k-1][c])。

綜合以上所述,我們可以得到乙個遞推表示式:

整個遞迴過程,我們可以以乙個分支為例,簡單畫一下:

旁邊的分支我們可以自己拿筆畫,可以發現,b[5][20]=26,也就是這道題的實際答案。

#include#include//假設包的重量和商品的種類都不超過100

int b[105][105];

int main()

執行結果如下:

完畢!第一次學習揹包、第一次寫文章,有見者請多包涵,另外有錯誤希望指正!

揹包問題初步

揹包問題 knapsack problem 是一種組合優化的np完全問題。問題可以描述為 給定一組物品,每種物品都有自己的重量和 在限定的總重量內,我們如何選擇,才能使得物品的總 最高。問題的名稱 於如何選擇最合適的物品放置於給定揹包中。相似問題經常出現在商業 組合數學,計算複雜性理論 密碼學和應用...

動態規劃初步(一)01揹包問題

首先,我們設想乙個場景 當你準備外出的時候,你有乙個容量有限的揹包,還有若干個想要帶走的物品,每個物品都有它的體積和在你心中的價值。但是呢,因為揹包容量有限,你只能選擇部分帶走。這時,我們就得到了乙個問題,如何才能夠使得揹包裝的價值總量最大呢?現假設,揹包的容量是t,共有n個物品,第i個物品的體積為...

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...