python贪心算法活动安排_浅谈Python实现贪心算法与活动安排问题

浅谈Python实现贪心算法与活动安排问题

贪心算法

原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质。

如题:给出一组活动,告诉每个活动的开始时间和结束时间,要求出算出能参加的最多活动的数量或者活动的起止时间

贪心算法思路:

用两个数组s,f分别存储活动的起止时间,根据活动的结束时间对活动进行一个非减的活动序列,同样活动的开始时间list也要做对应的调整,这里博主是通过冒泡排序同步交换的,举例:活动(1,4)(2,3)(3,5)那么我们得到的

s = [2,1,3]

f = [3,4,5]

通过比较下一个活动的开始时间与上一个活动的结束时间的大小关系,确定这两个活动是否是相容的,如果开始时间大于结束时间,则相容,反之不相容,代码如下

#用冒泡排序对结束时间进行排序,同时得到对应的开始时间的list

def bubble_sort(s,f):

for i in range(len(f)):

for j in range(0,len(f)-i-1):

if f[j] > f[j+1]:

f[j], f[j+1] = f[j+1],f[j]

s[j],s[j+1] = s[j+1],s[j]

return s,f

def greedy(s,f,n):

a = [True for x in range(n)]

#初始选择第一个活动

j = 0

for i in range(1,n):

#如果下一个活动的开始时间大于等于上个活动的结束时间

if s[i] >= f[j]:

a[i] = True

j = i

else:

a[i] = False

return a

n = int(input())

arr = input().split()

s = []

f = []

for ar in arr:

ar = ar[1:-1]

start = int(ar.split(',')[0])

end = int(ar.split(',')[1])

s.append(start)

f.append(end)

s,f = bubble_sort(s,f)

A = greedy(s,f,n)

res = []

for k in range(len(A)):

if A[k]:

res.append('({},{})'.format(s[k],f[k]))

print(' '.join(res))

执行结果如下:输入11个活动的起止时间,输出相容的活动的起止时间

50da8cdf9db972459571dfe9095ac2a9.png

以上就是本文的全部内容,希望对大家的学习有所帮助

完 谢谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值