最詳細完全揹包問題,小白也可以看懂,哦耶

2021-10-10 14:12:13 字數 1411 閱讀 5693

完全揹包是在n種物品中選取若干件(同一種物品可多次選取)放在空間為v的揹包裡

第i種物品的體積是v,價值是w

求將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大

首先看上面這張圖

左邊的黃色縱行代表的是第n件物品

上面的藍灰色橫行代表的是第n件物品的體積和價值

右邊的綠色橫行代表的是揹包容量的大小

—————————————————————————————

分析角度一:

先從揹包的角度來看,揹包體積的選擇範圍是從0~v,但是當揹包體積小於物品體積的時候,這個物品就是不選的,資料跟之前的相同。所以揹包體積的選擇範圍是從v[i] ~ v。

在揹包體積是j的情況下,物品i有選與不選兩種情況,對應以下**:

dp[j]

= math.

max(dp[j]

, dp[j - v[i]

]+ w[i]

);

這時候你有可能會問:不是物品還有多選的情況嗎?為什麼這裡只有選與不選的情況呢?

因為咱是從前往後遍歷的,也就是在揹包體積為j的情況下,j之前的所有資料都是在這個物品選與不選中的最優解,所以到揹包體積為j的之後,有可能之前這個物品已經選過多次了,或是一次都沒選。這裡的選與不選是針對一定體積揹包來說的。

完整**:

public

class

main

}return dp[v];}

}

角度二:

咱再從物品的角度來說,每種物品都有不選與多選的情況

最外層迴圈確定物品是啥(i)

中間迴圈因為從前往後會破壞資料,所以從後往前,具體是如何破壞的,咱也在0-1揹包中說過了。中間迴圈的目的是為了確定揹包的體積(j)

最後一層迴圈是為了確定物品的個數,因為選的個數不能使個數 * 物品體積 > 揹包體積,所以j - k * v[i] >= 0 (k)

所以dp[j]的值就應該在這k個物品放與不放中選擇:

1.不放:就是dp[i]

2.放:這個揹包得騰出k * v[i]的體積來放,同時價值增加了k * w[i]

dp[j]

= math.

max(dp[j]

, dp[j - k * v[i]

]+ k * w[i]

);

完整**:

public

class

main}}

return dp[v];}

}

完全揹包問題 詳細解答

首先完全揹包問題需要01揹包問題做鋪墊,如果讀者01揹包問題沒有解決,一定要理解之後,在看完全揹包問題,包括01揹包的優化 這裡是01揹包 這裡是01揹包的全部優化 好,我們開始完全揹包 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是v i 價值是val i 求解將哪些物...

揹包問題(完全揹包)

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

完全揹包問題

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