# 求最大价值
def max_values(goods, bag_size, goods_num):
# 创建一个二维数组来存放最大价值,100个体积,16个商品,17行,101列(保留一列为全0)
values = [[i for i in range(bag_size + 1)] for i in range(goods_num + 1)]
# 计算每种情况下的最大价值
for i in range(1, goods_num + 1):
for j in range(1, bag_size + 1):
if goods[i][0] <= j: # 商品体积小于等于背包容量
# 比较放入该商品和不放入该商品产生的最大价值
values[i][j] = max(values[i - 1][j], goods[i][1] + values[i - 1][j - goods[i][0]])
else: # 商品不能放入背包,此时最大价值等于前i-1个商品的最大价值
values[i][j] = values[i - 1][j]
return values
# 回溯,求哪些商品装入了背包
def search_goods(goods, values, bag_size, goods_num):
good = []
i = goods_num
j = bag_size
while values[i][j] != 0:
if values[i][j] != values[i - 1][j]: # 如果发现前n个物品最佳组合的价值和前n-1个物品最佳组合的价值不一样,说明第n个物品被装入了背包
good.append(i)
j -= goods[i][1] # 减去该商品的体积
i -= 1
else: # 第n个物品没有被装入
i -= 1
return good
if __name__ == '__main__':
# 共有16个商品,商品的体积和价格
goods = [[0, 0], [5, 6], [8, 3], [28, 19], [9, 20], [6, 15], [18, 12], [21, 10], [19, 22], [19, 8], [23, 18],
[10, 14], [9, 13], [34, 18], [26, 19], [38, 33], [9, 10]]
bag_size = 100 # 背包体积
goods_num = 16 # 商品数量
# price = [5, 8, 28, 9, 6, 18, 21, 19, 19, 23, 10, 9, 34, 26, 38, 9]
# volume = [6, 3, 19, 20, 15, 12, 10, 22, 8, 18, 14, 13, 18, 19, 33, 10]
values = max_values(goods, bag_size, goods_num)
for i in range(goods_num + 1): # 打印列表
print(values[i])
good = search_goods(goods, values, bag_size, goods_num)
print("产生的最大价值为:", values[goods_num][bag_size])
print("放入背包的商品为:", good)
发表评论