DP學習筆記
阿新 • • 發佈:2018-11-14
DP學習筆記
可是記下來有什麼用呢?我又不會
笨蛋你以後就會了
完全揹包問題
先理解初始的DP方程:
void solve()
{
for(int i=0;i<;i++)
for(int j=0;j<=w;j++)
for(int k=0;k*w[i]<=j;k++)
dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]);
}
其中:k*w[i]<=j
是指:如果當前的物品小於揹包容量,則選擇該物品
dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i])
dp[i+1][j]
中。
很明顯會\(\color {darkblue}{TLE}\),所以得優化:
void solve() { for(int i=0;i<n;i++) { for(int j=0;j<=w;j++) { if(j<w[i]) dp[i+1][j]=dp[i][j]; else dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]); } } }
優化方法:
在計算dp[i+1][j]
的結果,是和dp[i+1][j-w[i]]
計算選擇k-1
的時候是一樣的。所以可以發現dp[i+1][j]
的結果已經在算dp[i+1][j-w[i]]
的時候算完了,所以可以變形。