背包问题(贪心算法)

在这里插入图片描述
在这里插入图片描述

步骤代码:

"""
已知背包问题如下: 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))

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

回家种蜜柚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值