贪心算法
贪心算法指的是,在对问题求解时,总是做出当前看来最好的选择。也就是说,不从整体最优上加以考虑,所做出的是某种意义上的局部最优解。
注意:贪心算法并不保证会得到最优解,但是在某种问题上贪心算法就是最优解。
一、背包问题
问题可以描述为:给定一组物品,每种物品都有自己的重量w和价格v,在限定的总重量W内,我们如何选择,才能使得物品的总价格最高。
1. 0-1背包,对于一个物品,要么完整取走,要么留下。既不能取走多次,也不能只拿走一部分。
2. 分数背包,对于一个物品,可以取走其中任意一部分。
举例:
商品1: v=60, w=10
商品1: v=100, w=20
商品1: v=120, w=30
背包容量:W=50
goods = [(60, 10), (100, 20), (120, 30)]
def fractional_backpack(goods, w):
# mindex指示取第几个,值表示取几个
m = [0 for _ in range(len(goods))]
total_v = 0
goods.sort(key=lambda x: x[0]/x[1], reverse=True)
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
return m, total_v
print(fractional_backpack(goods, 50))
二、拼接最大数字问题
有n个非负整数,将其按照字符串拼接的方式拼接成一个整数。如何拼接可以使整数最大。
例子:32,94,128,1286,6, 71可以拼接的最大整数是 94716321286128
from functools import cmp_to_key
num_list = [32, 94, 128, 1286, 6, 71]
def xy_cmp(x, y):
if x+y < y+x:
return 1
elif x+y > y+x:
return -1
else:
return 0
def num_join(li):
li = list(map(str, li))
li.sort(key=cmp_to_key(xy_cmp))
return ''.join(li)
print(num_join(num_list))