贪心算法就是通过找到局部最优解啦计算。
找零问题,商铺老板需要找零钱n元钱,钱的面额有: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))
思想,当前的钱币情况,为了让给的钱最少,所以是按照高面额到低面额进行分析。
背包问题:
一个小偷在商店发现n个商品,第i个商品价值v元,重w千克。希望拿走的价值尽量高。背包最多容纳w千克。
0-1背包,商品要么拿要么不拿。可以同一个商品拿很多次。
分数背包:对于一个商品,小偷可以拿其中的任意一部分。
举例:商品1:v=60, w=10
商品 | |
价值 | 重量 |
60 | 10 |
100 | 20 |
120 | 50 |
背包重50 |
思考:可以想是分数背包还是0-1背包
0-1背包是用动态规划来做,这里做一下分数背包
goods = [(60,10),(120,20),(120,30)] # 价格和重量
def fractional_backpack(goods, w):
goods.sort(key=lambda x: x[0]/x[1], reverse =True) # 性价比
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:
m[i] = w / weight
total_v = m[i] * price
w = 0
break
拼接最大数字,有n个非负整数,将其中按照字符串拼接,如何使得得到的整数最大?
# 思路就是根据寻找12还是21那个比较合适
from functools import cmp_to_key
Li
def xy_cmp(x,y):
if x+y > y+x:
return 1
elif x+y < y+x:
return -1
else:
return 0
def complex_num(li):
li = list(map(str, li)))
li.sort(key=cmp_to_key(xy_cmp))
return "".join(li)
活动选择:
安排哪些活动可以使场地举办活动的个数最多?证明:假设a是所有活动中最先结束的活动,b是最优解中最先结束的
首先肯定会返回a-b,
activities = [(),(),(),(),()]
activities.sort(key=lambda x:x[1])
def activity_selection(a):
res = [a[0]]
for i in range(1, len(a)):
a[i][0] >= res[-1][1]: # 当前活动的开始时间小于等于最后一个活动的结束时间,不冲突
res.append(a[i])
return res