揹包問題與動態規劃[python]

    問題描述:有一個揹包,他的容量爲C。現在有n種不同的物品 編號爲0...n-1,其中每一件物品的重量爲w(i),價值爲v(i)。問可以向這個揹包中存放哪些物品,使得在不超過揹包容量的基礎上,物品的總價值最大

    解決思路:

    1. 暴力解法:每個物品都可以放進或者不放進揹包,2^n種情況。n次運算選擇最大的。

                        時間複雜度O((2^n)*n)

    2. 動態規劃:狀態F(n, C) 爲將n個物品放進容量C的揹包的最優解。(一個狀態兩個參數:n, C)

                        i 狀態 有兩種選擇: 放進第i個物品 和 不放 第i個物品

                        狀態轉移方程爲: F(i, C) = max{ v(i)+F(i-1, C-w(i)) , F(i-1,C) }

github: https://github.com/lzneu/Algrithm_python

python代碼實現:

class Solution:
    def backPack(self, w, v, C):
        '''

        :param w: list
        :param v: list
        :param C: int 揹包最大容量
        :return: int
        '''
        n = len(w)
        if n == 0 or C == 0:
            return 0
        row = [-1 for i in range(C+1)]
        memo = [row.copy() for i in range(n)]
        # 第一行計算
        for i in range(C+1):
            if i >= w[0]:
                memo[0][i] = v[0]
            else:
                memo[0][i] = 0

        for i in range(1, n):  # 增加i個物品後的最優化計算
            for j in range(C+1):  # 第i個物品 第j個位置的最大價值
                if j >= w[i]:
                    memo[i][j] = max(v[i]+memo[i-1][j-w[i]], memo[i-1][j])
                else:  # j < w[i]
                    memo[i][j] = memo[i-1][j]
        return memo[n-1][C]

# 測試
w = [1,2,3]
v = [6,10,12]
C = 5
print(Solution().backPack(w, v,C))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章