01背包问题:
其中0-1背包问题是最基本的问题,其问题描述如下:

给出n物体珠的重量和其价值,将他们装入一个固定大小的背包,最多能装入的总价值有多大?

之所以叫0-1背包,就是因为n个物品,每个只有一件,只有装包/不装包两种状态,即0-1问题。

理解01背包有几个点

  • 理解背包问题的描述,如图,将有价值和重量的物体,放入固定大小的背包。算出最大价值

1200px-Knapsack.png

  • 理解01背包问题的表格,假设有a,b,c,d,e五个物体,其重量分别为2,2,6,5,4,价值分别为6,3,5,4,6,当背包可容纳的重量从1变化到10时,最大的价值

Snipaste_2020-05-09_10-07-17.png

  • 理解最大价值的公式:

最大价值等于 前一个最大价值,和前一个减去该物体重量的最大价值加上该物体的价值,这两者取最大值

optimal[i][j]=max(optimal[i-1][j],optimal[i-1][j-weight[i-1]]+value[i-1])
  • 理解一维数组求最大价值

因为我们不用关心第二维度上的最大价值,我们只要关心前一个最大价值,和减去该物品最大价值加上该物品的价值,这两者取最大价值

optimal[j]=max(optimal[j],optimal[j-weight[i]]+value[i])
  1. Python的实现
# 0-1 Knapsack Problem 0-1背包问题


weight = [4, 5, 6, 2, 2]
value = [6, 4, 5, 3, 6]
CAPACITY = 8
NUM = len(weight)


def knapsack_MATRIX():
    optimal = [[0 for x in range(CAPACITY + 1)] for x in range(NUM + 1)]
    for i in range(1, NUM + 1):
        for j in range(1, CAPACITY + 1):
            if weight[i - 1] <= j:
                optimal[i][j] = max(optimal[i - 1][j], optimal[i - 1][j - weight[i - 1]] + value[i - 1])
            else:
                optimal[i][j] = optimal[i - 1][j]
            print(optimal[i][j], end=" ")
        print("\n", end="")
    print("\nthe optimal solution is:" + str(optimal[NUM][CAPACITY]) + "\n")


def knapsack():
    optimal = [0 for x in range(CAPACITY + 1)]
    for i in range(0, NUM):
        for j in range(CAPACITY, weight[i] - 1, -1):
            optimal[j] = max(optimal[j], optimal[j - weight[i]] + value[i])
            print(optimal[j], end=" ")
        print("\n", end="")
    print("\nthe optimal solution is:" + str(optimal[CAPACITY]) + "\n")


if __name__ == '__main__':
    print("二维数组\n________")
    knapsack_MATRIX()
    print("一维数组\n________")
    knapsack()

Andy
14 声望2 粉丝

不要bug