簡單01揹包 完全揹包

2021-07-09 11:46:21 字數 1368 閱讀 4990

01揹包問題

有n個重量和價值分別為wi,vi的物品。從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。

1<=n<=100

1<=wi,vi<=100

1<=w<=10000

第一行輸入n的值

接下來n行輸入wi,vi

最後一行輸入w

for example:

input:

2 31 2

3 42 2

output:

在解決01揹包問題,我們將n件物品拆分成n步,每次從n件物品中拿出一件,並於0~w重量中的最優價值進行比較(前提是那件物品能夠放的下)。

所以我們需要乙個輔助的dp[j]陣列,j表示剩餘空間的量。

初始dp陣列值為0(因為沒有物品放入價值當然為0)

求n件物品在重量在w內的最大價值,我們就必須求出:

1件物品在重量為1的最優價值;1件物品在重量為2的最優價值...1件物品在重量為w的最優價值。

1件物品在重量為1的最優價值;1件物品在重量為2的最優價值...1件物品在重量為w的最優價值。

當j=w[i]時,我們就要比較原數值與「騰出」來w[i]單位的價值+該物品的價值。選擇較大的值進行覆蓋。(因為可能會用到j之前的數值,所以j必須從高位向低位移動)

公式:dp[j] = max(dp[j], dp[j - w[i]] + v[i])   (j >= w[i])

最後dp[w]就是解得值。

#include#include#includeusing namespace std;

void solve(int dp, int n, int weight, int w, int v);

int main()

完全揹包

有n種重量和價值分別為wi,vi的物品。從這些物品中挑選總重量不超過w的物品,求出挑選物品價值總和的最大值。在這裡,每種物品可以挑選任意多件。

for example:

input:

3 44 5

2 3output:

完全揹包與01揹包解題思路一樣,只不過在是否重複放第i件物品時,與j-w[i]的機制一樣,所以放與不放取決於dp[j-w[i]]的值,所以填表順序必須正序填充。

#include#include#includeusing namespace std;

void solve(int dp[101], int w, int v, int n, int w);

int main()

, v[101] = , dp[101] = , n, i, w;

while (~scanf("%d", &n))

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...

01揹包 完全揹包

本文主要使用一維陣列進行使用 意思 01揹包 代表物品只有兩種狀態,只能使用一次。如,dp i max dp i dp i wight j value j 代表容量為i所獲得的最大利潤。完全揹包 乙個物品可以使用無限次 技巧 1.如果是0 1揹包,即陣列中的元素不可重複使用,nums放在外迴圈,ta...

揹包 01揹包,完全揹包,多重揹包

哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...