每當有人看到這樣的題目:數組
有n 種物品(各有一件/都有無限件/有有限件),它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裏裝入的物品具備最大的價值總和?spa
那我的可能會喊道:code
個人媽呀。。。又是揹包【哭】blog
今天我必定要搞懂揹包!input
這我的,是你,也(就)是我。(dalao們好!)io
這是最基礎的揹包問題class
咱們不妨從輸入講起基礎
能夠用結構體structobject
struct str{ int w; int v; } object[n];
也能夠用數組di
int v[n],w[n];
爲表達方便,如下代碼使用數組
這裏用一種我從未見過的表達方式:
用dp[i][j]表示以j爲剩餘容量,選擇性的放入前i個物品的最大價值。
初始化:
dp[0][j]=dp[i][0]=0;
進入下一步的選擇:
對於每個物品,你有兩個選擇:
容量不足,裝不下它:
此時的價值==前i-1個物品時的價值,即dp[i][j]=dp[i-1][j]
容量足以裝下它,but不必定能達到當前最優價:
在選與不選中選擇一個最優的,即dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};
其中dp[i-1][j]爲不裝狀況,dp[i-1][j-w[i]]+v[i]爲裝的狀況
這就是遞推式了
dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]};