大家都知道的01揹包問題

2021-10-05 11:18:54 字數 1410 閱讀 5039

一維解法

拓展問題

完全揹包

對於每乙個物品,在揹包容量足夠的情況下,我們有兩種狀態,一種是把該物品放在揹包,一種是不把該物品放在揹包。

我們建立乙個二維的陣列,dp[ i ][ j ] 表示前 i 個物品,在容量為 j 的時候,最大價值。

v[ i ] 表示物品所佔的體積 ,w[ i ] 表示物品的價值

把該物品放在揹包:dp[ i ][ j ] = max(dp[ i ][ j ], dp[ i - 1 ][ j - v[ i ] ] + w[ i ] )

因為要把這個物品放在揹包,所以揹包中首先得有該物品的容量大小。

#include

#include

using

namespace std;

const

int n =

1010

;int dp[n]

[n];

int v[n]

,w[n]

;//物品所佔的體積,物品所佔的價值

intmain()

cout<

[m]<

return0;

}

在動態規劃中,對於這種當前狀態只與前一層的狀態有關的情況,我們就可以對陣列進行壓縮,可以把二維變成一維。

上面的問題求的是,揹包中物品的總價值最大,但是此時揹包確是不一定滿的。

如果問題改為,求揹包中物品的體積之和恰好為揹包的容量的時候,怎麼做呢?我們可以在初始化的時候做點手腳。

通過改進後,我們就可以確保dp[ n ]的值是從初始狀態轉移過來的。也就是揹包中物品體積恰好為揹包體積時,揹包中物品的最大價值,

y總的解釋很詳細

大家都知道的多重揹包與混合揹包

多重揹包2 混合揹包 與01揹包不同的是,多重揹包的每乙個物品有s件,而01揹包每個物品有1件。我們是不是可以進行乙個拆分,把這s件物品拆成01揹包的模型來計算。我們再看物品的數量,假設最多的100件物品,每個物品可以取100次,我們使用三重迴圈的話,時間複雜度是100 100 100,也就是10的...

揹包問題 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 ...