数据结构与算法(八)贪心算法

一.贪心算法

在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。

二.最优装载问题

1.问题描述

有一天海盗们截获了一艘装满各种各样古董的货船,每一件都价值连城,一旦打碎就是去了价值,
海盗船载重量为C,每件固定的重量为wi,海盗们该如何尽可能装载最多数量的古董呢?

2.算法设计

在这里插入图片描述

3.代码实现

antique = [4, 10, 7, 11, 3, 5, 14, 2]
def max_ans(antique):
    antique_sort = sorted(antique)
    ans, tmp = 0, 0
    ship = []
    for item in antique_sort:
        tmp += item
        if tmp <= 30:
            ans += 1
            ship.append(item)
    print('装载古董数量:', ans)
    print('装载的古董:', ship)
max_ans(antique)

在这里插入图片描述

二.教室调度问题

1.问题描述

在这里插入图片描述

2.算法设计

你希望在这间教室上尽可能多的课。如何选出尽可能多且时间不冲突的课程呢?
具体做法如下:
(1) 选出结束最早的课,它就是要在这间教室上的第一堂课。
(2) 接下来,必须选择第一堂课结束后才开始的课。同样,你选择结束最早的课,这将是要在这间教室上的第二堂课。
重复这样做就能找出答案!
在这里插入图片描述
贪婪算法很简单:每步都采取最优的做法。在这个示例中,你每次都选择结束最早的课。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。

三.背包问题

1.问题描述

在这里插入图片描述

2.算法设计

1.计算出每件宝物的性价比,按照从高到低排序;
2.根据贪心策略,按性价比从大到小选取宝物,直到达到毛驴的运载能力。每次选择宝物后判断是否
小于m,如果不小于则取走宝物的一部分,程序结束。

3.代码实现

datas = [[4, 3], [3, 8], [9, 18], [11, 30], [5, 8],
        [3, 6], [4, 13], [3, 9]]
m = 30
w = 0
for i in range(len(datas)):
    price = datas[i][1] / datas[i][0]
    datas[i].append(price)
datas.sort(key=lambda data: data[2], reverse=True)
for data in datas:
    if data[0] <= m:
        w += data[1]
        m -= data[0]
    else:
        w += data[2]*m
        break
print('总价值', w)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值