動態規劃 揹包問題

2021-09-07 01:30:44 字數 2060 閱讀 2066

話說有一哥們去森林裡玩發現了一堆寶石,他數了數,一共同擁有n個。 但他身上能裝寶石的就僅僅有乙個揹包,揹包的容量為c。這哥們把n個寶石排成一排並編上號: 0,1,2,…,n-1。

第i個寶石相應的體積和價值分別為v[i]和w[i] 。排好後這哥們開始思考: 揹包總共也就僅僅能裝**積為c的東西。那我要裝下哪些寶石才幹讓我獲得最大的利益呢?

ok,假設是你,你會怎麼做?你斬釘截鐵的說:動態規劃啊!恭喜你,答對了。

那麼讓我們來看看。動態規劃中最最最重要的兩個概念: 狀態和狀態轉移方程在這個問題中各自是什麼。

我們要如何去定義狀態呢?這個狀態總不能是憑空想象或是從天上掉下來的吧。 為了方便說明,讓我們先例項化上面的問題。

一般遇到n,你就果斷地給n賦予乙個非常小的數, 比方n=3。然後設揹包容量c=10,三個寶石的體積為5,4。3,相應的價值為20,10。12。

對於這個樣例,我想智商大於0的人都知道正解應該是把體積為5和3的寶石裝到揹包裡, 此時相應的價值是20+12=32。接下來,我們把第三個寶石拿走, 同一時候揹包容量減去第三個寶石的體積(由於它是裝入揹包的寶石之中的乙個)。 於是問題的各引數變為:n=2,c=7,體積{5,4}。價值{20,10}。好了。 如今這個問題的解是什麼?我想智商等於0的也解得出了:把體積為5的寶石放入揹包 (然後剩**積2。裝不下第二個寶石。僅僅能眼睜睜看著它溜走),此時價值為20。

這樣一來,我們發現,n=3時。放入揹包的是0號和2號寶石。當n=2時, 我們放入的是0號寶石。這並非乙個偶然。沒錯。 這就是傳說中的「全域性最優解包括區域性最優解」(n=2是n=3情況的乙個區域性子問題)。 繞了那麼大的圈子。你可能要問。這都哪跟哪啊?說好的狀態呢?說好的狀態轉移方程呢? 別急,它們已經呼之欲出了。

我們再把上面的樣例理一下。當n=2時,我們要求的是前2個寶石。 裝到體積為7的揹包裡能達到的最大價值;當n=3時,我們要求的是前3個寶石, 裝到體積為10的揹包裡能達到的最大價值。

有沒有發現它們事實上是乙個句式。ok, 讓我們形式化地表示一下它們, 定義d(i,j)為前i個寶石裝到剩餘體積為j的揹包裡能達到的最大價值。 那麼上面兩句話即為:d(2, 7)和d(3, 10)。這樣看著真是爽多了, 而這兩個看著非常爽的符號就是我們要找的狀態了。 即狀態d(i,j)表示前i個寶石裝到剩餘體積為j的揹包裡能達到的最大價值。 上面那麼多的文字,用一句話概括就是:依據子問題定義狀態。你找到子問題。 狀態也就浮出水面了。而我們終於要求解的最大價值即為d(n, c):前n個寶石 (0,1,2…,n-1)裝入剩餘容量為c的揹包中的最大價值。狀態好不easy找到了。 狀態轉移方程呢?顧名思義,狀態轉移方程就是描寫敘述狀態是怎麼轉移的方程(好廢話!

)。 那麼回到樣例。d(2, 7)和d(3, 10)是怎麼轉移的?來,我們來說說2號寶石 (記住寶石編號是從0開始的)。從d(2, 7)到d(3, 10)就隔了這個2號寶石。 它有兩種情況,裝或者不裝入揹包。假設裝入,在面對前2個寶石時, 揹包就僅僅剩**積7來裝它們,而對應的要加上2號寶石的價值12, d(3, 10)=d(2, 10-3)+12=d(2, 7)+12。假設不裝入,體積仍為10。價值自然不變了, d(3, 10)=d(2, 10)。記住。d(3, 10)表示的是前3個寶石裝入到剩餘體積為10 的揹包裡能達到的最大價值。既然是最大價值,就有d(3, 10)=max。

好了,這條方程描寫敘述了狀態d(i, j)的一些關係。 沒錯,它就是狀態轉移方程了。把它形式化一下:d(i, j)=max。注意討論前i個寶石裝入揹包的時候, 事實上是在考查第i-1個寶石裝不裝入揹包(由於寶石是從0開始編號的)。至此。 狀態和狀態轉移方程都已經有了。

//volume寶石體積陣列,worthness寶石價值陣列,n寶石種類個數。c揹包體積

//狀態d(i,j)表示前i個寶石裝到剩餘體積為j的揹包裡能達到的最大價值

int knapsack(int volume,int worthness,int n,int c)

for (int j=0;j<=c;j++)

else

if (i>0&&j>=volume[i-1])}}

} int *uesd=new int[n];//標記是否拾起

for (int i=0;i0; --i)

} for(int i=0; i

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...