问题一:
# 找零问题
m=[100,50,20,10,5,1]
def money_return(money,M):
count=[0 for _ in range(len(money))]
for index,value in enumerate(money):
count[index] += M // money[index]
M = M % money[index]
return count,M
print(money_return(m,559))
问题二:背包问题
0-1背包:
- 商品1 和商品2 :价值160
- 商品2 和商品3: 价值 220
因此0-1背包不能用贪心算法解释。
分数背包:可以拿部分商品
先拿单位重量最值钱的商品
goods=[(60,10),(100,20),(120,30)] # 每个商品元组表示(价格,重量)
goods.sort(key=lambda x: x[0]/x[1],reverse=True) # 按照包含x的公式排序,且reverse=True表示倒序
def fractional_backpack(goods,w):
m=[0 for _ in range(len(goods))]
total_v = 0
for i,(price,weight) in enumerate(goods):
if w >= weight:
m[i]=1
total_v += price
w -=weight
else: #w<weight
m[i] = w/weight
total_v +=price*m[i]
w = 0
return m,total_v
print(fractional_backpack(goods,50))
问题三:拼接最大数字问题
思考:按照首个数字的大小排序;128 和 1286 的情形;728 和 7286 情形;
a='96';b='87' a+b if a>b else b+a a='128';b='1286' a+b='1281286';b+a='1286128' a+b if a+b>b+a else b+a a='728';b='7286' a+b if a+b>b+a else b+a # a+b='7287286' b+a='7286728'
# 数字拼接排序
from functools import cmp_to_key
li=[32,94,128,1286,6,71]
def xy_cmp(x,y):
if x+y < y+x:
return 1 # 满足条件x+y<y+x时,交换x,y
elif x+y > y+x:
return -1
else:
return 0
def number_join(li):
li=list(map(str,li))
li.sort(key=cmp_to_key(xy_cmp)) # 数字拼接排序
return "".join(li)
print(number_join(li))
问题四:活动选择问题
思考:
# 活动选择问题
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))