贪心策略之部分背包问题

这篇博客探讨了如何在限定容量下选择饮品以最大化价值。通过定义性价比并进行排序,采用贪心策略选取最高性价比的饮品。然而,贪心策略并不总是能找到全局最优解,特别是在物品不可分割的情况下,如01背包问题。动态规划在这种场景下可能提供更优解决方案。文章展示了如何使用排序和贪心策略实现这一过程,并给出了具体的代码实现。
摘要由CSDN通过智能技术生成

问题描述:容量800ml的杯子,可任选不超过体积上限的饮料混合,所用饮料价格之和最高获胜:

在这里插入图片描述

def BubbleSort(v, w):               ## 排序函数
    x = [0 for i in range(len(v))]      ## 定义性价比数组
    z = [0 for i in range(len(v))]
    y = dict()                       ## 创建新字典(用来存储性价比一开始所在的数组位置)
    for i in range(len(v)):
        x[i] = v[i]/w[i]             ## 求出各饮料的性价比
#     print(x)           

    for i in range(len(x)):          ## 创建字典,用性价比做key,原始位置做value
        y[str(x[i])]=i               ## 将性价比的原始位置存入y字典中
#     print(y)
    ## 遍历所有数组元素
    for i in range(len(x)):
        for j in range(0, len(x)-i-1):
            if (x[j] < x[j+1]):          ## 性价比由高到低输出 
                x[j], x[j+1] = x[j+1], x[j]
    for i in range(len(x)):             ## 用一个新的数组存储性价比从高到低的原始数组位置
        z[i] = y.get(str(x[i])) 
    print("性价比高到低的原始数组位置:")
    print(z)       
    print("排序后性价比:")
    print(x)
    return z           ## 返回性价比排序后的位置数组
def FractionlKnapsack(v, w, c, xjb):     ## 贪心策略
    ma = 0                     ## 饮料价值
    for i in xjb:
        if(w[i] < c):          ## 当容量足够,则全部倒入
            ma = v[i]+ma
            c = c-w[i]
        elif(c > 0):          ## 容量不足,部分倒入(把部分倒入的价值算出来加进去)
            ma = ma+v[i]/w[i]*c
            c = 0
    print("饮料的最大价值为:")
    print(ma)

调用函数:

Value = [60,10,36,16,45]
Weight = [600,250,200,100,300]
C = 800
xjb = BubbleSort(Value, Weight)             ## 排序性价比
FractionlKnapsack(Value, Weight, C, xjb)      ## 贪心策略求最大值

贪心策略与动态规划对比:贪心策略物品可分割,动态规划物品不可分割(连续和离散)

贪心只看到了局部最优情况(只在乎眼前)不一定能得到全局最优(例如01背包就不行),因为01背包是离散的,物品不可分割。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值