我們先來討論 01揹包
先看一下二維陣列的遍歷
f[i][j] 表示前i件物品,在容量不超過j的情況下的最大權值
n 表示種類, t 表示 容量
w[maxn]表示重量,v[maxn]表示價值
for(i=1;i<=n;i++)
for(j=w[i];j<=t;j++)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
01揹包的關鍵兩點: 1. 選與不選。
2.前 i 件物品的 dp 情況,是由前 i-1 件物品的dp推出來的,不受本i件物品的dp的影響
再看一維的遍歷
for(i=1;i<=n;i++)
for(j=t;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
第二層迴圈的遍歷就是為了滿足上述的第二個條件。 我們先設 j1 > j2 ,更新dp[ j1 ] 肯定在 更新dp[ j2 ] 的前面,就算 j1- w[i] = j2 , 也不會受影響。 故在 第 i 層的迴圈下,可以保證各個dp[ j ] 是由 前 i -1 層 dp 推出來的,而不會受本次迴圈其他dp更新的影響。
也可以用反證法,當第二層迴圈為遞增迴圈時
for(i=1;i<=n;i++) // 完全揹包
for(j=w[i];j<=t;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
也先設 j1 > j2 ,如果 j1 - w[i] == j2 . 而更新 dp[ j2 ] 在 dp [ j1 ] 前面,故 dp[ j1 ] 會受到 dp[ j2 ] 的影響。這與第二個條件不符。
不過這與完全揹包的條件相符
for(i=1;i<=n;i++)
for(j=w[i];j<=t;j++)
dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);
完全揹包的關鍵兩點: 1. 可選有窮個。
2. 前 i 件物品的 dp 情況,是由前 i 件物品的dp推出來的,受本i件物品的dp的影響
01揹包和完全揹包
在hihocoder上面的題目中看到的這個問題,總結一下。先看01揹包問題。01揹包問題 乙個揹包總容量為v,現在有n個物品,第i個 物品體積為weight i 價值為value i 現在往揹包裡面裝東西,怎麼裝能使揹包的內物品價值最大?看到這個問題,可能會想到貪心演算法,但是貪心其實是不對的。例如...
0 1揹包和完全揹包
一.0 1揹包 1.0 1揹包指的是每件物品要麼取一次,要麼不取,目的是找到裝到揹包裡最大價值。c n 代表物體重量,w n 代表物體價值,v代表揹包容量。2.時間複雜度 o n v n指的是物品個數,v指的是揹包的容量,這是最優情況,無法再優。3.空間複雜度 原始 f n 1 v 1 改進 f v...
01揹包,完全揹包
動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...