1. 程式人生 > 其它 >費曼學習法是方法騙局嗎?且聽知識兔會員揭開謎底

費曼學習法是方法騙局嗎?且聽知識兔會員揭開謎底

貪心演算法指的是,在對問題求解時,總是做出當前看來最好的選擇。也就是說,不從整體最優上加以考慮,所做出的是某種意義上的區域性最優解。

注意:貪心演算法並不保證會得到最優解,但是在某種問題上貪心演算法就是最優解。

一、揹包問題

問題可以描述為:給定一組物品,每種物品都有自己的重量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))