贪心算法
python实现贪心算法代码如下:
#贪心算法
#1找零问题的贪心算法
def change(t,n):
#对t进行从大到小的排序
t.sort()
t.reverse()
#定义t的每一个的数量
m=[0 for _ in range(len(t))]
for i,money in enumerate(t):
m[i]=n // money
n=n % money
return m,n
t=[100,5,20,5,1]
print(change(t,376))
#2背包问题(0-1背包和分数背包问题)
#分数背包算法是贪心算法,可以得到最优解
goods=[(60,10),(100,20),(120,30)] #每个商品价格和对应的重量
goods.sort(key=lambda x:x[0]/x[1],reverse=True) #首先对货物的均价进行计算排序
def fractional_backpack(goods,w):
m=[0 for _ in range(len(goods))] #假设开始均为0
total_value=0
for i,(price,weight) in enumerate(goods):
if w>=weight:
m[i]=1
total_value+=price
w-=weight
else:
m[i]=w/weight
total_value+=m[i]*price
w=0
break
return m,total_value
print(fractional_backpack(goods,50))
#3数字拼接问题(贪心a+b的大小)
a="96"
b="87"
#a+b if a>b else b+a
a="128"
b="1286"
#a+b="1281286"
#b+a="1286128"
#a+b<b+a
a="728"
b="7286"
#a+b>b+a
li=[32,94,128,1286,6,71]
from functools import cmp_to_key #导入cmp函数
def xy_cmp(x,y):
if x+y<y+x:
return 1
elif x+y>y+x:
return -1
else:
return 0
def number_join(li):
li=list(map(str,li)) #将list各个元素进行字符串化
li.sort(key=cmp_to_key(xy_cmp))
return "".join(li)
print(number_join(li))
#4活动选择问题(贪心最早结束的活动)
activity=[(1,4),(3,5),(0,6),(5,7),(3,9),(5,9),(6,10),(8,11),(8,12),(2,14),(12,16)]
activity.sort(key=lambda x:x[1]) #先要按照结束时间进行排序
print(activity)
def activity_selection(a): #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(activity))
li=[2,3,1,2,5,6,7,8]
def cmp(x,y):
if x>y:
return 1
elif x<y:
return -1
else:
return 0
li.sort(key=cmp_to_key(cmp))
print(li)#顺序排列