# -*- coding:utf-8 -*-
"""
问题描述:
有N件物品和一个容量为W的背包。第i件物品的重量为w[i],价值为v[i]。求在装入物品不超过背包容量的前提下,背包中物品最
大价值是多少。
解题思路:
构造二位数组result[i][j]表示当背包容量为j,选择前i件物品的最大价值。那么result[i][j]=max(result[i-1][j],result[i][j-
weight[i]]+value[i])。result[i-1][j]表示不选择i的最大价值,result[i][j-weight[i]]+value[i]选择i的最大价值。
"""
import random
total_weight = 200
weight = [random.randint(1,100) for _ in range(10)]
value = [random.randint(1,100) for _ in range(10)]
print("weight = {}".format(weight))
print("value = {}".format(value))
def get_max_value(total_weight, weight, value):
# 初始化
result = []
for _ in range(len(value) + 1):
result.append([0 for _ in range(total_weight+1)])
# 求最大价值
for i in range(len(value)):
for j in range(1, total_weight + 1):
if weight[i] <=j:
result[i+1][j] = max(result[i][j], result[i][j-weight[i]]+value[i])
else:
result[i+1][j] = result[i][j]
# 求选择物品
v = [0 for _ in range(len(value))]
w = total_weight
for i in range(len(value) -1, -1, -1):
if result[i+1][w] == result[i][w]:
v[i] = 0
else:
v[i] = 1
w = w - weight[i]
print("选择的物品是: {}".format(v))
print("最大价值: {}".format(result[len(value)][total_weight]))
if __name__ == "__main__":
get_max_value(total_weight, weight, value)
python实现0-1背包算法
最新推荐文章于 2024-05-05 20:03:02 发布