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 重量 花...