完全揹包問題

2021-08-18 08:32:28 字數 2041 閱讀 7918

完全揹包是揹包問題的基礎問題之一,和前面介紹的01揹包類似,唯一的不同的是每件物品不再是只有一件,而是無限件

01揹包前面已經做了簡單的總結。

完全揹包問題的描述如下:給定n

n

件物品,對於第

i' role="presentation">i

i件物品,其價值為vi

v

i,重量為wi

w

i,與此同時還存在乙個體積為

v v

的揹包,每件物品有無限件,求揹包能裝下的物品的最大價值

p' role="presentation">pp。

對應的模型為:s.

t.∑n

i=1w

i∗xi

<=v,

xi∈n

s .t

.∑i=

1nwi

∗xi<=v,

xi∈n

maxp=∑

ni=1

vi∗x

i max

p=∑i

=1nv

i∗xi

解法同01揹包十分類似,狀態轉移方程為:

else }}

return dp[n - 1][bagv];

}

public

static

void

main(string args) ;// 物品的價值

int weight = new

int ;// 物品的重量

int bagv = 15;// 揹包的大小

system.out.println(knapsackproblemcompletion(value, weight, bagv));

}

演算法的時間複雜度為: o(

nv) o(n

v),空間複雜度為:o(

nv) o(n

v)。二維狀態陣列可以用如下的二維**表示:

由前面的狀態轉移方程我們可以知道,fi

,jf i,

j的狀態只和前一輪的狀態fi

−1,j

f i−

1,j和本輪的稍早的某個狀態fi

,j−w

i fi,

j−wi

有關,因此可以像01揹包問題一樣,將二維陣列優化為一維滾動陣列,優化後空間複雜度降為o(

v)o (v

)。

public

static

intknapsackproblemcompletionoptimization(int value, int weight, int bagv)

}return dp[bagv];

}

特別注意這裡的內部迴圈的迴圈順序:

for (int j = weight[i]; j <= bagv; j++)
有時候我們不僅僅需要找到能到到最優收益值,還需要找到具體的裝包方案,我們可以根據狀態陣列從後往前倒推得出裝包方案。

完全揹包是揹包問題的基礎問題問題之一,和01揹包非常類似但是也有些許區別。

完全揹包和01揹包的區別:完全揹包的物品是無限的,而01揹包的物品只有一件。

兩者的狀態轉移方程為:

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

完全揹包問題

這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...

完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...