1. 程式人生 > >動態規劃法—0-1揹包問題(一)

動態規劃法—0-1揹包問題(一)

0-1揹包問題

  • 問題描述

    給定n個物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為W。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

  • 約束條件

    放入揹包的物品的重量<=揹包容量W
    物品只能進入揹包或不進入揹包,不可拆分,區別於部分揹包問題。

  • 求解目標

    我們可以這樣來刻畫問題的解。
    假如有n個物品,用Xi表示第i個物品的狀態。Xi 的值為0或1。0表示物品未進入揹包,1表示物品進入揹包。
    那麼問題的解就是一個集合(X1,X2,X3,…,Xi,…,Xn)
    所以,我們就是要求,使揹包總價值最大時,集合中各元素的值,是(0,0,1,…,0,…,1),還是(1,1,0,…,0,…,1)等等情況。

動態規劃解決問題的思路

對於0-1揹包問題,我們可以想象當揹包容量很小的時候,可能進入揹包的物品也相對變少(因為有些物品的重量已經超過了揹包容量),那麼為了使揹包總價值最大,我們選擇它進不進揹包,就很容易。但是當揹包容量相對較大時,可能進入揹包物品的個數就會變多。問題就變得複雜。簡而言之,當揹包容量小的時候,可選項(可選擇進入物品)較少,當揹包容量大的時候,可選項變多。

這裡寫圖片描述

現在假設有5個物品,它們各自的重量都小於揹包容量。可選項有5個,解的集合為(X1,X2,X3,X4,X5)。假設問題的最優解是(1,0,0,1,1)。如何能得出這個最優解呢?我們就從這5個裡面隨便拿出一個物品考慮,看看它在揹包裡的價值大,還是不在揹包裡的價值大。

我們剛假設了已經知道了最優解,假如我們拿出物品1來考慮,那麼它在揹包裡的價值肯定大於它不在揹包的價值。而假如我們拿出的是物品2來考慮,那麼,它不在揹包裡的價值肯定大於它在揹包裡的價值,因為它未被選中。

我們現在用表示式來描述一個物品進入進入揹包之後揹包的總價值和不在揹包裡的總價值。假設該物品時第一個被考慮的。
進入揹包:待考慮的可選物品在揹包容量為W-wi時的最大價值+vi
不在揹包:待考慮的可選物品在揹包容量為W時的最大價值

如果該物品進入揹包的總價值大於它不在揹包的價值,我們就選中該物品,即認為最優解裡包含該物品。

這裡寫圖片描述

針對上面的表示式,強調兩點:
不論是動態規劃法,還是貪心法,還是回溯法,它們都會用到分治思想(把大問題化解成小問題)。那麼對進入揹包這種情況:我們利用分治思想把大問題轉化成揹包容量為W-wi子問題+vi;不在揹包這種情況,把大問題轉化成揹包容量為W的子問題+0。

  • 第一點:我們對兩種不同情況都利用了分治思想,但是這兩種情況下的子問題的是不一樣的,因為這兩個子問題的約束條件不一樣,一個揹包容量為W-Wi,另一個為W。

  • 第二點:我們看到要想求這兩種情況下,誰的總價值大,必須依賴於前一個子問題的最優解。只有前一個子問題求解出來之後,當前問題才能解決。而在考慮前一個子問題的最優解時,我們還是以相同的方式,任選一個待考慮的物品,看它在揹包裡導致的子問題的價值大,還是不在裡面導致的子問題的價值大。而在這個過程中,子問題的約束條件揹包容量變得越來越小。那麼回到我們最開始說的問題,當揹包容量很小的時候,可選的物品就會變少,選擇一個可選的物品在還是不在揹包裡就特別容易.

由於上述原因,我們就先從揹包容量為0的時候開始考慮問題最優解,然後逐漸增大揹包容量,直到能求出容量為W時候的最優解。而較大揹包容量時候的最優解,依賴於前面較小揹包容量時的解。

總結

當在幾個可選的物品中選擇誰應該進入揹包時。思考的過程是:我們先拿一個物品考慮它在不在揹包裡,然後在此基礎上,再接著考慮另一個物品在不在揹包裡的問題,在這個過程中揹包容量是逐漸縮小的。而求解的過程是,先求出揹包容量小的時候的解,再求出揹包容量增大後的解,揹包容量是逐漸增大的。揹包容量逐步變化的這個過程就體現了動態二字。而每個子問題下都要比較在揹包和不在揹包哪個價值大,這個比較求最大價值的過程就是規劃