sunny-cheng  
贪心算法概念
贪心算法(又称贪婪算法,因文名:reedy algorithm)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解
 
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

思想

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止
 
例题分析
一、找零问题
假设商店需要找钱,钱币面额有100,50,20,5,1元,如何找零所需钱币数量最少?
t = [100,50,20,5,1]

def change(t,n):
m = [0 for _ in range(len(t))]
for i,money in enumerate(t):
m[i] = n//money
n = n % money
return m,n

print(change(t,376))
 

二、0-1背包问题

有一个背包,背包容量是w。有3物品,
(60价格,10容量),(100,20),(120,30)
物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量
 

goods = [(60,10),(100,20),(120,30)] #总价 重量
goods.sort(key=lambda x:x[0]/x[1],reverse=True) #按均价排序
print(goods)

def fractional_backpack(goods,w):
m = [0 for _ in range(len(goods))] #生成临时列表[0, 0, 0]
print(m)
total_v=0 #背包里的价值
for i,(price,weight)in enumerate(goods):
if w > weight : #
m[i] = 1
total_v += price
w -= weight
else:
m[i] = w / weight
total_v += m[i]*price
w=0
break
return m

print(fractional_backpack(goods,50))
 

三、活动最优方案

学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断。现在各个社团都提交了他们使用该中心的活动计划(即活动的开始时刻和截止时刻)。请设计一个算法来找到一个最佳的分配序列,以能够在大学生艺术中心安排不冲突的尽可能多的社团活动。

activities = [(1,4),(3,5),(0,6),(5,7),(3,9),(5,9),(6,10),(8,11),(8,12),(2,14),(12,16)]
#保证活动是按照结束时间排序的
activities.sort(key=lambda x : x[1])

def activity_selection(a):
res = [a[0]] #取最早结束的活动
for i in range(1,len(a)):
if a[i][0]>=res[-1][1] : #当前活动开始时间>上个活动结束时间
res.append(a[i])

return res

print(activity_selection(activities))
          
 
 
 
 
 
posted on 2019-04-22 17:53  sunny-cheng  阅读(265)  评论(0编辑  收藏  举报