1. 程式人生 > >DP學習筆記

DP學習筆記

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]]的時候算完了,所以可以變形。