【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

使用 Hugo 建立
主題 StackJimmy 設計