利用贪心算法求解背包问题【python实现】
求解思路:求出各物品价值与体积之比,由高到低排序,尽可能放价值比高的物品。
""""
author:xuke
实现功能:利用贪心算法求解背包问题
"""
#各物品的体积列表
v = []
#各物品的价值列表
val = []
#各物品编号
num = []
#各物品价格/体重
v_val = []
#输入背包体积
VS = eval(input("背包体积为:"))
#输入物品种类数
S = eval(input("物品种类数目为:"))
#输入各物品信息
for i in range(S):
num.append(input("第{}类物品的编号为:".format(i+1)))
v.append(eval(input("第{}类物品的体积为:".format(i + 1))))
val.append(eval(input("第{}类物品的价值为:".format(i + 1))))
print("各物品信息:")
print("编号:{}".format(num))
print("体积:{}".format(v))
print("价值:{}".format(val))
#计算价格与体重之比
for i in range(S):
v_val.append(val[i]/v[i])
#排序
for i in range(S):
for j in range(i+1,S):
if v_val[i] < v_val[j]:
v_val[i],v_val[j] = v_val[j],v_val[i]
v[i],v[j] = v[j],v[i]
val[i],val[j] = val[j],val[i]
num[i],num[j] = num[j],num[i]
print("编号:{}".format(num))
print("体积:{}".format(v))
print("价值:{}".format(val))
#不可分割物品
#当前背包占用体积
v1_now = 0
#当前背包内价值
val1_now = 0
print("背包内加入的物品编号有:",end='')
for i in range(S):
if (v[i] + v1_now) <= VS:
v1_now +=v[i]
val1_now += val[i]
print(num[i],end='')
else:
break
print()
#背包占用体积为
print("背包体积:{}".format(v1_now))
print("背包价值:{}".format(val1_now))
#可分割物品
#当前背包占用体积
v2_now = 0
#当前背包内价值
val2_now = 0
print("背包内加入的物品编号有:",end='')
for i in range(S):
if (v[i] + v2_now) <= VS:
v2_now +=v[i]
val2_now += val[i]
print(num[i],end='')
elif v2_now < VS:
last = VS - v2_now
val2_now +=val[i]*(last/v[i])
v2_now = VS
print(num[i],end='')
elif v2_now == VS:
break
print()
print("背包价值:{}".format(val2_now))