01背包问题(贪心算法-动态规划-Python)

题目:

假设有n中物品和一个购物车,物品i的价值为vi,重量wi,购物车的容量为W。每种物品只有一件,要么放入,要么不放入,不可拆分。在不超过购物车容量的情况下,选择将哪些物品放入购物车,能使放入的物品价值最高?

# 购物车载重量
W = 10
# 物品个数n
n = 5
# 物品重量
w = [2, 5, 4, 2, 3]
# 物品价值
v = [6, 3, 5, 4, 6]
# 物品单价
p = []
for i in range(n):
    p.append(v[i]/w[i])
print(p)
# 物品标签
k = [i for i in range(1, n+1)]
# 物品
arr = []
arr.append(w)
arr.append(v)
arr.append(p)
arr.append(k)
print(arr)
# 按单价降序,如果单价一样,按重量降序

sorted_arr = [list(x) for x in zip(
    *sorted(zip(*arr), key=lambda x: (x[2], x[0]), reverse=True))]

print(sorted_arr)

# 总重量
sw = 0
# 总价值
sv = 0
i = 0
while sw < W:
    sw += sorted_arr[0][i]
    sv += sorted_arr[1][i]
    # del w[sorted_arr[3][i]]
    temp = sorted_arr[1][i-1]
    v[sorted_arr[3][i]-1] = 0
    i += 1
i -= 1
sw -= arr[0][i]
print(sv)
print(arr[1][i])
sv -= temp
gap = W-sw
mv = 0
for i in range(len(w)):
    if w[i] <= gap and v[i] > mv:
        mv = v[i]
sv += mv
print("实际重量为", sw)
print("最大价值为", sv)

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值