0 1揹包問題(不可拆分問題)

2021-10-02 06:45:04 字數 1680 閱讀 2272

假期 2020.01

.18

0-1揹包問題是乙個經典的np-hard組合優化問題,現實生活中的很多問題都可以以它為模型。本博文從動態規劃的角度進行問題的分析,分析了0-1揹包問題的數學模型,刻劃了最優解的結構特徵,建立了求最優值的遞迴關係式。

0-1揹包問題一般描述為:給定n種物品和乙個揹包。物品i的重量是w(i),其價值為v(i),揹包的容量為c。問應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大? 

注:每個物品只能使用一次。

0-1揹包問題,關鍵在於物體是不可以分割的。本文採用動態規劃的思想解決該問題。

假設有5個物品,陣列weight[ i ] 存每乙個物品的重量,value[ i ] 存每乙個物品的價值。如圖

對於每乙個物品存在放入和不放入的兩種處理狀態,並且為了便於表示,將二維陣列c [ i ] [ j ]表示將第 i 件物品放入容量為 j 的揹包中可以獲得的最大價值。

對於放入與不放入的條件判斷,當揹包的容量不夠時,肯定是不能放入的;當揹包的容量足夠時,我們需要在放入與不放入的兩種情況下比較找出最優解,再賦值給c [ i ] [ j ]即可

;//方案

int weight[size]

, value[size]

;//重量,價值

int check[size]

;//標誌物品i是否放入揹包,為1時放入,為零時不放入

intmain()

} cout <<

"裝入揹包的最大價值是"

<< c[n]

[m]<

j = m;

for(i = n; i >=

1; i--)if

(c[i -1]

[j]< c[i]

[j])

//因為未裝入物品i時,存在c[i][j] = c[i - 1][j];

else

check[i]=0

; cout <<

"裝入的物品為:"

補充演算法實現證明

假設已經知道x = 是原問題的最優解,且值為w1,那麼原問題去掉最後乙個物品就成為子問題,該問題最優解為,我們只需要證明是的最優解即可。

反證:假設不是的最優解,那麼存在最優解是該問題的最優解,那麼存在w2使w1

揹包問題 01揹包問題

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

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...