01揹包和完全揹包一維陣列遍歷區別

2021-08-22 11:32:42 字數 1348 閱讀 9525

我們先來討論 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 表示...