贪心算法

1. 什么是贪心算法

  贪心算法,又称贪婪算法,是一种在解决问题的过程中追求局部最优的算法,对于一个有多种属性的事物来说,贪心算法会优先满足某种条件,追求局部最优的同时希望达到整体最优的效果。它并不保证得到整体的最优解,但在某些问题上,贪心算法的解就是最优解。

 

2. 找零问题

  描述:有若干面值的纸币,给定一个总数额,来找出最少的纸币数量。

  思路:利用贪心算法,先从最大的纸币开始找,以此类推,直到找完为止

money = [100, 50, 20, 10, 5, 1]

def greedy(money, n):
    m = [0 for i in range(len(money))]
    for index, val in enumerate(money):
        m[index] = n // val
        n = n % val
    return m

 

3. 背包问题:背包问题分为0-1背包和分数,分数背包可以利用贪婪算法求

  描述:有几种物品,物品拥有重量和价值两个属性,用一个指定容量的背包去装这些物品,物品放入包中时,物品可以不完全放入包中,而放入一部分,求价值最大的方案。

  思路:在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。 计算每种物品的单位重量价值作为贪心选择的依据指标,选择单位重量价值最高的物品,将尽可能多的该物品装入背包,依此策略一直地进行下去,直到背包装满为止。 在零一背包问题中贪心选择之所以不能得到最优解原因是贪心选择无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。 

# 分数背包问题
goods = [(60, 10), (120, 30), (100, 20)]
# 按照价值的权重进行排序,即价值除以重量,reverse为True表示倒序
goods.sort(key=lambda x: x[0]/x[1], reverse=True)
print(goods)
def grade_backage(goods, w):
    m = [0 for i in range(len(goods))]
    total_p = 0
    for i, (prize, weight) in enumerate(goods):
        if w >= weight:
            m[i] = 1
            total_p += prize
            w -= weight
        else:
            m[i] = w / weight
            total_p += m[i] * prize
            break
    return total_p, m

print(grade_backage(goods,40))

 

posted @ 2023-01-13 23:35  无敌小豆包  阅读(332)  评论(0)    收藏  举报