coin chenge 動態規劃

2021-09-19 04:18:55 字數 1134 閱讀 7861

import sys

def coinchange( coins, amount):

dp = [0] #dp表示的是組成當前面值需要最少的基礎面值幣數

length = len(coins)

for i in range(1, amount + 1):

for j in range(length):

if i >= coins[j] and dp[int(i - coins[j])] != 9999:

dp[i] = min(dp[i], dp[i - coins[j]] + 1)

if dp[amount] == 9999:

return -1

return dp[amount]

if __name__=="__main__":

arr=list(map(int,sys.stdin.readline().strip().split()))

n=int(sys.stdin.readline().strip())

# num=coin_change(arr,n)

num=coinchange(arr,n)

print(num)

寫個博記錄一下最近在看的演算法題,估計寫法也只有自己能看的懂了,dp問題的介紹可能以後在寫一篇記錄一下,這篇就直接上**了,輸入輸出風格和牛客一樣,畢竟都要在牛客筆試。dp[i]表示積累到i這樣乙個面值所要的最少的基本面額 [1,2,5]的最少個數,這個第一和爬樓梯乙個思路,老用i有點抽象,畢竟小白都不算,舉個例子吧,基本 面額【1,2,5】 問要湊夠11這個面值最少要多少張,dp[11]可以從dp[10],dp[9],dp[6],這三個狀態(這個表述不精確想不出有啥好理解的解釋,以後自己應該能看懂吧)加1 就是到dp[11]的最少個數,關於dpdpdp,遞迴求解,在思考dp時候預設他們已知,邊界條件的考慮 dp肯定是0呀,第一層迴圈初始化到達不同面值所需要的基本面額個數,第二層迴圈就是去試對於不同面額的三個候選那個能湊出來 dp【i】,if中的第乙個條件,就是要的面值要大於基本面額才有意義,第二個條件是說,如果某個面額比i小可以用來湊,同時還要滿足,dp【i-coin【j】】是能被基本面額拼出來的,如果都滿足那就開始迭代更新,如果有些面值不能被拼成就返回-1,例如只有一種基本面額 你卻想要dp,這是不行的,ok 就這樣吧。

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...

《動態規劃》 ACM 動態規劃例題詳解

描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...