Loading

贪心算法

贪心算法指的是,在对问题求解时,总是做出当前看来最好的选择。也就是说,不从整体最优上加以考虑,所做出的是某种意义上的局部最优解。

注意:贪心算法并不保证会得到最优解,但是在某种问题上贪心算法就是最优解。

一、背包问题

问题可以描述为:给定一组物品,每种物品都有自己的重量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))

 

posted @ 2021-08-10 20:38  climber_dzw  阅读(78)  评论(0编辑  收藏  举报