步骤代码:
"""
已知背包问题如下: n = 7, W = 15, w = (2, 3, 5, 7, 1, 4, 1), v = (10, 5, 15, 7, 6, 18, 3)
求该问题的最优解和最优值
"""
# 建立函数
def Greedy_knapsack(Weight, w, v):
table = list()
# 获取关系列表
arr = get_w_v(w, v)
sum = 0
# 逐行进行遍历比较
for i in range(len(w)):
# 若背包无存储容量时, 退出循环
if Weight <= 0:
break
# 若背包仍有存储容量时
# 若背包剩余存储容量大于物品的重量, 则将物品全部装入
if Weight >= arr[i][1]:
sum += arr[i][2]
# 记录对应序号物品的装入的比例
table.append({arr[i][0]: 1})
# 装完此物品后扣掉相应的背包容量
Weight = Weight - arr[i][1]
# 若背包容量不足以全部装入当前物品时
else:
# 计算装入可装入的部分
sum += Weight * arr[i][-1]
# 记录对应序号物品的装入的比例
table.append({arr[i][0]: round(Weight/arr[i][1], 2)})
# 最后记录最大价值
table.append({'最大价值' : sum})
Weight = Weight - arr[i][1]
return table
# 获取关系列表
def get_w_v(w, v):
# 获取物品个数
n = len(w)
# 建立列表
arr = list()
# 按行逐行建立
for i in range(n):
# 从左到右四个属性分贝为:物品序号, 物品重量, 物品价值, 单位重量价值
arr.append([i + 1, w[i], v[i], round(v[i] / w[i], 2)])
# 按物品单位价值的多少对关系列表进行降序排序
arr = sorted(arr, key=lambda x: x[-1], reverse=True)
# 返回列表
return arr
if __name__ == '__main__':
# 背包重量
Weight = 15
# 物品重量列表
w = [2, 3, 5, 7, 1, 4, 1]
# 物品价值列表
v = [10, 5, 15, 7, 6, 18, 3]
arr = list()
print(Greedy_knapsack(Weight, w, v))