動態規劃 揹包問題 Knapsack

2022-08-11 10:12:15 字數 3243 閱讀 5174

2018-03-15 13:11:12

揹包問題(knapsack problem)是一種組合優化的np完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和**,在限定的總重量內,我們如何選擇,才能使得物品的總**最高。問題的名稱**於如何選擇最合適的物品放置於給定揹包中。

相似問題經常出現在商業、組合數學,計算複雜性理論、密碼學和應用數學等領域中。

一、0/1揹包問題

揹包問題是個npc問題,01揹包可以通過動態規劃演算法在偽多項式時間內給出解。

0/1揹包問題的特點是,每種物品僅僅有一件,且需要選擇放或者不放。

在0/1揹包問題中,物品i或者被裝入揹包,或者不被裝入揹包,設xi表示物品i裝入揹包的情況,則當xi=0時,表示物品i沒有被裝入揹包,xi=1時,表示物品i被裝入揹包。根據問題的要求,有如下約束條件和目標函式:

於是,問題歸結為尋找乙個滿足約束條件式2.1,並使目標函式式2.2達到最大的解向量x=(x1, x2, …, xn)。

0/1揹包問題可以看作是決策乙個序列(x1, x2, …, xn),對任一變數xi的決策是決定xi=1還是xi=0。在對xi-1決策後,已確定了(x1, …, xi-1),在決策xi時,問題處於下列兩種狀態之一:

(1)揹包容量不足以裝入物品i,則xi=0,揹包不增加價值;

(2)揹包容量可以裝入物品i,則xi=1,揹包的價值增加了vi。

這兩種情況下揹包價值的最大者應該是對xi決策後的揹包價值。令v(i, j)表示在前i(1≤i≤n)個物品中能夠裝入容量為j(1≤j≤c)的揹包中的物品的最大值,則可以得到如下動態規劃函式:

式2.3表明:把前面i個物品裝入容量為0的揹包和把0個物品裝入容量為j的揹包,得到的價值均為0。

式2.4的第乙個式子表明:如果第i個物品的重量大於揹包的容量,則裝入前i個物品得到的最大價值和裝入前i-1個物品得到的最大價值是相同的,即物品i不能裝入揹包;第二個式子表明:如果第i個物品的重量小於揹包的容量,則會有以下兩種情況:

(1)如果把第i個物品裝入揹包,則揹包中物品的價值等於把前i-1個物品裝入容量為j-wi的揹包中的價值加上第i個物品的價值vi;

(2)如果第i個物品沒有裝入揹包,則揹包中物品的價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。顯然,取二者中價值較大者作為把前i個物品裝入容量為j的揹包中的最優解。

舉個例子:

例如,有5個物品,其重量分別是,價值分別為,揹包的容量為10。

根據動態規劃函式,用乙個(n+1)×(c+1)的二維表v,v[i][j]表示把前i個物品裝入容量為j的揹包中獲得的最大價值。

第一階段,只裝入前1個物品,確定在各種情況下的揹包能夠得到的最大價值;

第二階段,只裝入前2個物品,確定在各種情況下的揹包能夠得到的最大價值;

依此類推,直到第n個階段。最後,v(n,c)便是在容量為c的揹包中裝入n個物品

時取得的最大價值。

如何確定裝入揹包的具體物品?

從v(n,c)的值向前推,如果v(n,c)>v(n-1,c),表明第n個物品被裝入揹包,前n-1個物品被裝入容量為c-wn的揹包中;否則,第n個物品沒有被裝入揹包,前n-1個物品被裝入容量為c的揹包中。依此類推,直到確定第1個物品是否被裝入揹包中為止。由此,得到如下函式:

}另外,在初始化的時候,如果是題目沒有要求必須得最終裝滿揹包,則直接使用上述**即可,如果題目中指出必須裝滿揹包,則在初始化的時候,除了v[0][0] = 0外,其餘的0件物品,j個重量,抑或j個重量,0件物品都是不滿足裝滿揹包的條件的,應該初始化為負無窮大。

二、完全揹包問題

完全揹包問題同樣給出了n件物品的重量和價值,並且給出了揹包的大小w,但是和0/1揹包不同的是,在完全揹包問題中,每件物品可以選1,2,3...直到揹包放不下為止。

完全揹包是0/1揹包問題的乙個擴充套件,也同樣是乙個非常經典的問題。

運用模擬的思想,我們可以將完全揹包轉化成0/1揹包,具體的轉化可以有下面兩種方式:

1、將每件物品看成w/w[i]件,價值不變;

2、將每件物品看成v[i]*2^k,重量為w[i]*2^k,想法就是利用二進位制的角度看問題,任何多種選擇都可以通過這些二進位制數相加得到,這種方法的分解個數顯然要小很多,非常聰明。

如果從遞推式的角度來解決問題,可以得到乙個非常好的解答:

v[i][j] = max

對於每乙個v[i][j]都可以看成要麼不選擇第i件,要麼選擇第i件且可以多選,那麼就可以很容易的得到上述的遞推式。

下面使用一維陣列進行實現,你會發現除了內層的順序變了,其他的都沒有改變。

static int polish(int v, int w, int w)

}return m[w];

}

動態規劃 揹包問題

給定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 元。於是,他把每...