每種物品只有一件
對於二維降一維,外層迴圈中的每乙個i其實是不需要記錄的
所以在第i次迴圈剛開始時,所有的dp都未更新,此時下面的dp[x]記錄的是前i-1個物品在容量是x時的最大值(x>=0&&x<=v)
dp[0]
dp[1]
dp[2]
dp[…]
dp[v]
相當於dp[i][x]=dp[i-1][x]和dp[i-1][x-w[i]]+c[i]
for
(int i=
1;i<=n;i++
)}
所以x遞減遍歷的原因:我們要保證在i時刻求解dp[x]的時候,max比較的dp[x]項與dp[x-w[i]]+c[i]項必須是i-1時刻的值,
dp[0]
dp[1]
dp[2]
dp[…]
dp[x-w[i]]
dp[…]
dp[x]
dp[…]
dp[v]
假如我們正序遍歷,從左往右第一次更新得到的dp[x-w[i]]+c[i],此時它的含義是前i個物品在容量是x-w[i]時的最大值,然後再往後,更新到dp[x]時顯然max中的dp[x-w[i]]+c[i]項中的i-1時刻的值已經被覆蓋為i時刻的值了,所以不能正序遍歷,需要逆序遍歷,防止被更新
每種物品有無窮件
首先區別與01揹包,因為物品有無窮件所以放第i件時轉移到的是dp[i][x-w[i]]+c[i],在i-1時刻其儲存的意義也是dp[x]記錄的是前i-1個物品在容量是x時的最大值
for(int i=
1;i<=n;i++)
}
所以x遞增遍歷的原因:因為放放第i件時轉移到的是dp[i][x-w[i]]+c[i],對應與dp[x-w[i]]+c[i],它表示的是前i個物品在容量是x-w[i]時的最大值*,所以需要正序遍歷(上面講過啦~)
( * ^ ▽ ^ * )啃了一天,終於啃明白這倆降維了
0 1揹包與完全揹包
現有 n 件物品,乙個最大容量為 w 的揹包。第 i 件物品重量為 wi 價值為 vi 已知對於一件物品,你必須選擇取或不取,且每件物品只能被取一次 這就是 0 1 的含義 求放置哪幾件物品進揹包,使得揹包中物品價值最大 或是求最大價值是多少等衍生問題 設 ans n,w 為當揹包容重量為 w 有 ...
揹包問題 01揹包與完全揹包
一 介紹 揹包問題是最廣為人知的動態規劃問題,都是給定限定的揹包容量與物品,求所能裝下的最大價值 完全揹包 有n種物品,每種均有無限多,第i種物品額體積為v i 重量 價值 為w i 01揹包 有n種物品,每種只有乙個,第i種物品額體積為v i 重量 價值 為w i 在揹包問題中,我們把不同種的物品...
01揹包,完全揹包
動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...