2019vivo秋招提前批筆試題第3題


筆試的時候沒做出來,就順手截圖了。

雖然知道要用動態規划做,但我一直就不太懂動態規划。筆試完又花了2小時把它做出來了。也不知道性能怎么樣,但還好做出來了。

def solution(n, toltal_money, until_price, until_hot):
    # 二維數組,每一行代表0到total_money每一個數對應的解(解是一個數組,第0列是最高熱度值,后面分別是湊成此熱度的因子)
    # 因為不允許重復采購同一個商品,所以需要標識一下湊成此熱度值時已經購買的商品,方便后面的解用到時查看那些商品是已經購買了的。
    price_hot = [[0 for a in range(n+1)] for k in range(toltal_money + 1)]
    for i in range(toltal_money + 1):
        j = 0
        # 臨時數組,保存的是二維數組的每一行的值(0到total_money的某些數值的解可能會有多個解法,
        # 但我們需要找出熱度值最高的哪一個,所以這里需要臨時保存一下,在確定了最高熱度值得時候再把這個解復制到二維數組中去)
        temp = [0 for i in range(n+1)]
        # 構造最優解
        while j < n:
            if (i - until_price[j]) >= 0:
                # 判斷是否重復買了商品,需要將上一個最高熱度值得因子組成復制下來。
                for x in range(1, n+1):
                    temp[x] = price_hot[i - until_price[j]][x]
                # 如果新購買的這個商品沒有在上一個解里被標示,則可以構成一個解
                if temp[j+1] == 0:
                    last = price_hot[i - until_price[j]][0] + until_hot[j]
                    # 找出最優解
                    if temp[0] < last:
                        temp[0] = last
                        # 標識已購買得商品,這里我把商品得熱度填進去做了標識,這樣就可以在數組中直接看出最高熱度的組成因子
                        # 當然把商品加個填進去做標識,甚至直接把它標為1也可以。
                        temp[j+1] = until_hot[j]
                        # 將臨時存放得最優解放到二維數組里
                        for x in range(n + 1):
                            price_hot[i][x] = temp[x]
            j += 1
    return price_hot[total_money][0]


n = 6
total_money = 1000
until_price = [200, 600, 100, 180, 300, 450]
until_hot = [6, 10, 3, 4, 5, 8]

print("total_money=1000時的解:", solution(n, total_money, until_price, until_hot))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM