01背包问题:
其中0-1背包问题是最基本的问题,其问题描述如下:
给出n物体珠的重量和其价值,将他们装入一个固定大小的背包,最多能装入的总价值有多大?
之所以叫0-1背包,就是因为n个物品,每个只有一件,只有装包/不装包两种状态,即0-1问题。
理解01背包有几个点
- 理解背包问题的描述,如图,将有价值和重量的物体,放入固定大小的背包。算出最大价值
- 理解01背包问题的表格,假设有a,b,c,d,e五个物体,其重量分别为2,2,6,5,4,价值分别为6,3,5,4,6,当背包可容纳的重量从1变化到10时,最大的价值
- 理解最大价值的公式:
最大价值等于 前一个最大价值,和前一个减去该物体重量的最大价值加上该物体的价值,这两者取最大值
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])
- 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()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。