【Lintcode】python - [125] Backpack II 個人解法筆記

題目出處

125 · Backpack II

難度

medium

個人範例程式碼

from typing import (
    List,
)

class Solution:
    """
    @param m: An integer m denotes the size of a backpack
    @param a: Given n items with size A[i]
    @param v: Given n items with value V[i]
    @return: The maximum value
    """
    def back_pack_i_i(self, m: int, a: List[int], v: List[int]) -> int:
        # write your code here
        # dp[i][j] = max price (i this round take, j volume)
        n = len(a)
        dp = [[0] * (m+1) for _ in range(n+1)]

        for i in range(1, n+1):
            for j in range(1, m+1):
                dp[i][j] = dp[i-1][j]
                last_volume = j - a[i-1]
                if last_volume >= 0:
                    dp[i][j] = max(dp[i][j], dp[i-1][last_volume] + v[i-1])

        print(dp[-1])
        return max(dp[-1])

算法說明

本題是背包系列問題的第 2 題,建議初學者可以從第一題開始去學:
第 1 題:最基本的背包問題,不重複 size,物品只有一個,計算組合可能性
第 2 題:最基本的背包問題,不重複 size,物品只有一個,計算最大價值
第 3 題:完全背包問題,有重複 size,物品無限數量,計算最大價值
第 4 題:有重複 size,物品無限數量,計算可能組合 ,「(1,2,3) 與 (2,3,1) 視為相同答案」
第 5 題:有重複 size,物品有限數量,計算可能組合 ,「(1,2,3) 與 (2,3,1) 視為相同答案」
第 6 題:有重複 size,物品無限數量,計算可能「排列」 ,也就是說「(1,2,3) 與 (2,3,1) 視為不同答案」
第 7 題:有重複物品,有限制物品數數量上限,問可能組合
第 8 題:有重複物品,有限制物品數數量上限,問最大價值
第 9 題:變化問題,有重複 size,計算機率
第 10 題:變化問題,只是把 size 面額提高

這題比起第一題,我們多考慮物品的價值,第一題只需要考慮 size 即可。
我們用 dp 保存當下背包的 max value

input handling

一同在 dp 內處理

Boundary conditions

用兩層 for 來控制搜尋範圍,
外層 for size (表示我們選擇新的項目)
內層 for volume (表示紀錄目前已有的選擇下,可否達到裝滿的目標,並記錄最大價值)

Reference