Python————贪心算法

贪心算法

一、贪心算法

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

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

古董重量清单:
在这里插入图片描述1. 船载重量固定为C,只要每次选择重量最小的古董,直到不能再装为止,这样装载的古董数量最大,
这就是贪心策略;
2. 把古董按重量从小到大排序,根据策略选出尽可能多的古董。

代码实现

定义每个古董重量

antique = [4, 10, 7, 11, 3, 5, 14, 2]


def max_ans(antique):
    anti_sort = sorted(antique)  # 对重量排序
    ans, tmp = 0, 0  # ans记录装载古董数量,tmp记录装载古董重量
    ship = []  # 记录装载的古董
    for a in anti_sort:
        tmp += a
        if tmp <= 30:
            ans += 1
            ship.append(a)
    print('装载古董数量:', ans)
    print('装载的古董', ship)


max_ans(antique)
三、教室分配问题
  • 假设有如下课程表,你希望将尽可能多的课程安排在某间教室上。
    但是你没法让这些课都在这间教室上,因为有些课的上课时间有冲突。
    在这里插入图片描述
基本思路

在这里插入图片描述
你希望在这间教室上尽可能多的课。如何选出尽可能多且时间不冲突的课程呢?
具体做法如下:
(1) 选出结束最早的课,它就是要在这间教室上的第一堂课。
(2) 接下来,必须选择第一堂课结束后才开始的课。同样,你选择结束最早的课,这将是要在这间教室上的第二堂课。
重复这样做就能找出答案!

四、背包问题

假设山洞中有n种宝物,每种宝物有一定重量w和相应的价值v,毛驴运载能力
一种宝物只能拿一样,宝物可分割。怎样才能使毛驴运走宝物的价值最大呢?

  • 可以尝试三种贪心策略:
  1. 每次挑选价值最大的装东西入背包;
  2. 每次挑选最重的东西;
  3. 每次选取单位重量价值最大的东西。
算法设计
  1. 计算出每件宝物的性价比,按照从高到低排序;
  2. 根据贪心策略,按性价比从大到小选取宝物,直到达到毛驴的运载能力。每次选择宝物后判断是否
    小于m,如果不小于则取走宝物的一部分,程序结束。
代码实现
# datas中每个元素代表一个古董,每个列表第一个元素代表古董重量,第二个元素代表古董价值
datas = [[4, 3], [2, 8], [9, 18], [5, 6], [5, 8], [8, 20], [5, 5], [4, 6], [5, 7], [5, 15]]
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)
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值