如何把揹包問題轉化成動態規劃 01揹包 徹底揹包 多重揹包

如何把揹包問題轉化成動態規劃

緒言

每當有人看到這樣的題目:數組

有n 種物品(各有一件/都有無限件/有有限件),它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裏裝入的物品具備最大的價值總和?spa

那我的可能會喊道:code

個人媽呀。。。又是揹包【哭】blog

今天我必定要搞懂揹包!input

這我的,是你,也(就)是我。(dalao們好!)io

01揹包

這是最基礎的揹包問題class

咱們不妨從輸入講起基礎

input

能夠用結構體structobject

struct str{ int w; int v; } object[n];

也能夠用數組di

int v[n],w[n];

爲表達方便,如下代碼使用數組

solution

這裏用一種我從未見過的表達方式:

  用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]};

Code

相關文章
相關標籤/搜索