天天看點

《背包九講》學習筆記(未完待續)《背包九講》學習筆記(未完待續)

《背包九講》學習筆記(未完待續)

背包九講下載下傳位址

1. 01 背包問題

描述

n 個物品放進容量為v的背包,第 i 個物品的價值為wi,花費為 ci ,問能裝入物品的最大總價值。

核心代碼

///dp[j]為前i個物品裝在容量為j的背包内可以産生的最大總價值
int dp[v + ] = {};
for(int i = ; i < n; ++i) {
    for(int j = v; j >= c[i]; --j) {
         ///對于每個物品i,對于容量j,判斷是否從容量j-c[i]的背包加上一個i物品轉移來更優
        dp[j] = max(dp[j],dp[j - c[i]] + w[i]);
    }
}
           

複雜度

  • 時間複雜度

    O(vn)

  • 空間複雜度

    O(v)

例題

待續
           

備注

初始化:

  • 當不要求全部裝滿背包時,全部初始化為0
  • 當要求全部裝滿背包時,dp[0]初始化為0,其餘的初始化為-INF
  • 各類背包可參照該初始化技巧

與完全背包在寫法上的差別:

  • j 從v遞減到 ci ,因為每次隻會通路下标比j小的dp值,故這樣可以保證每種物品最多被取一次

2. 完全背包問題

描述

n 種物品各無限個放進容量為v的背包,第 i 種物品每個的價值為wi,花費為 ci ,問能裝入物品的最大總價值。

核心代碼

///dp[j]為前i種物品裝在容量為j的背包内可以産生的最大總價值
int dp[v + ] = {};
for(int i = ; i < n; ++i) {
    for(int j = c[i]; j <= v; ++j) {
        ///對于每個物品i,對于容量j,判斷是否從容量j-c[i]的背包加上一個i物品轉移來更優
        dp[j] = max(dp[j],dp[j - c[i]] + w[i]);
    }
}
           

複雜度

  • 時間複雜度

    O(vn)

  • 空間複雜度

    O(v)

例題

  • POJ 1384 Piggy-Bank

    AC代碼

備注

與01背包在寫法上的差別:

  • j 從ci遞增到 v <script type="math/tex" id="MathJax-Element-20">v</script>,當通路下标比j小的dp值時,該值可能是已經加入了物品i而産生的,故這樣可以使每種物品被取多次