讀揹包九講之二 完全揹包

2021-06-27 06:17:41 字數 838 閱讀 8321

沒想到完全揹包還有如此神奇的寫法。學習了。

還了解了和快速求冪類似的二進位制思想。

對於為什麼完全揹包能夠這樣直接從s[i][1]到v遍歷可行並且必須這樣,可以從兩個層面理解。一是從抽象的概念角度,也就是文章裡所說的,對於狀態dp[j],由於可能多次取到同乙個物品,所以從已經遍歷的方向向未遍歷的方向遍歷是正確的,並且只有以這個方向遍歷才是正確的。而是從具體的**執行流程考慮,假設dp[j]第一次取到了物品i,當j,也就是揹包容量增加到j+s[i][1]時,由於可以比較此時的dp[j']與dp[j]+s[i][0],故仍有可能再次取到第i個物品。

實在是妙,太妙了,讓我自己是怎麼都無法想像還能這樣解決完全揹包問題,關鍵是自己習慣並且只會進行形象思維,嚴密的邏輯思維是在太缺乏了。這種解法所蘊含的思維方式,其實是多麼自然多麼強大啊。

例題做的poj1384,這裡還涉及另乙個問題,揹包狀態的初始化,這裡要求揹包裝滿,於是未裝滿的揹包的價值是未定義的,不合理的,於是用-1來標記。具體的處理就是,只有合理的揹包才參與選擇。

#include#include#includeusing namespace std;

const int maxn=510,maxv=10005;

int dp[maxv],s[maxn][2];

int main()

}if(dp[v]>0)

printf("the minimum amount of money in the piggy-bank is %d.\n",dp[v]);

else

printf("this is impossible.\n");

}return 0;

}

揹包九講之 完全揹包

完全揹包與01揹包的區別在於完全揹包第i件物品可以在允許範圍內選無數個,同樣的v i 表示體積,w i 表示價值。同樣的,我們先從二維入手,較為顯而易見。dp i j 表示前i件物品在容量為j的最大價值,那麼相應的也會出現很多情況 1.不選 dp i j dp i 1 j 2.選一件 dp i j ...

揹包九講之二維成本揹包

多重揹包的理解請建立在01揹包與完全揹包的基礎上,在了解01揹包與完全揹包後,多重揹包即可不攻自破。01揹包 完全揹包 多重揹包 混合揹包 二維成本即一種物品需要支付兩種成本,前四講中,所有物品僅有乙個重量成本,放在容量為v的揹包當中,而在二維成本揹包中,則多了乙個約束。具體描述 有n種物品,其中第...

揹包九講 簡單揹包

揹包問題是一種動態規劃演算法的衍生問題。它可以被看作一種獨立的題型,也可以看作是一種線性動態規劃。學好揹包 學會揹包,對於深入理解動態規劃演算法有著極大的好處,並能幫助理解一些更深層次的動態規劃問題。那麼就開始吧 題目型別 有 n 件物品和乙個容量為 v 的揹包。第 i 件物品的費體積是 v i 價...