動態規劃--01揹包問題

星空28發表於2024-10-05

解題思路


二維列表思路


def bag_value(ls, vol):
    """
    :param ls: 水果體積及價值列表,列表長度表示水果種類,ls[i][0]表示體積,ls[i][1]表示價值,
    :param vol:揹包體積
    ls = [[3, 1], [4, 5], [5, 6], [7, 9]]
    vol = 10
    :return:
    """
    num = len(ls)   # 物品種類
    # 生成一個二維列表存放當前揹包體積時的最優價值
    dp_ls = [[0 for _ in range(vol+1)] for _ in range(len(ls)+1)]
    ls.insert(0, 0)

    for i in range(1, num+1):
        for j in range(1, vol+1):
            print(i, j)
            # i = 1
            if ls[i][0] <= j:
                # 比較上一個狀態dp_ls[i - 1][j]和當前狀態的值,最大有最優
                # 當前狀態的值 = 當前物品的價值 + (當前揹包的體積-物品的體積)即上一個最優狀態dp_ls[i-1]的列dp_ls[i-1][j-ls[i][0]]所對應的價值
                dp_ls[i][j] = max(dp_ls[i - 1][j], ls[i][1] + dp_ls[i-1][j-ls[i][0]])  #
                
            else:
                dp_ls[i][j] = dp_ls[i-1][j]

    print('最優矩陣:', dp_ls)
    print("最大價值:", dp_ls[-1][-1])

相關文章