動態規劃零錢問題

2021-10-06 05:06:18 字數 983 閱讀 2157

問題:給你 k 種面值的硬幣,面值分別為 c1, c2 … ck,每種硬幣的數量無限,

再給乙個總金額 amount,問你最少需要幾枚硬幣湊出這個金額,

如果不可能湊出,演算法返回 -1

比如說 k = 3,面值分別為 2,5,10,總金額 amount = 11。那麼最少需要 4枚硬幣湊出,即 11 = 5 + 2 + 2+2。

我們先列出一組結果值

0 小於2 結果為0

1 小於2 結果為0

2 為面值金額裡面的倍數 結果為1

3 為1的結果然後加上最小面額2 但是1為0 所以為0

4 2的結果加上最小面額 1+1 =2

5 為1

6 4的結果+1 為3

解決思路點

1.每次都以最小步長為基礎找出對應的值,當找到前面的結果為0或者為初始化值的時候,並且不被當前面值整除,說明沒有找到對應的值

2.當前值為當前的貨幣面值-對應貨幣面值的列值 如: 6 4的結果+1 為3

3.當結果為最大值或者為0時,不能找到

func

coinchange

(coins [

]int

, amount int

)int

else

}for i:=

0;i<

len(dp)

;i++

if dp[i-coin]

!= amount+

1if tmp!=

0&& tmp<

1+ dp[i-coin]

else

}else}}

}else}}

if dp[amount]

== amount+

1else

}func

main()

amount:=

33coinchange

(coins,amount)

}

動態規劃 , 零錢問題。

動態規劃 核心思想,找到最優子結構,組合子問題構成原問題的解。最重要的是,找到最優子結構,這是最難的部分 例題 我們有面值為1元3元5元的硬幣若干枚,如何用最少的硬幣湊夠11元?首先找到問題的子結構 1 選擇硬幣作為子結構變數,第一次選擇只有1元硬幣,求出構成11元硬幣的方案集合a1,第二次選擇有1...

動態規劃 零錢問題 python

零錢問題 暴力遞迴 遞推關係 對arr index 的使用的次數情況進行列舉,for int i 0,arr index i aim,i 對於每乙個i都對應乙個列舉的情況,在該列舉情況下可以重新調整引數,此時可以使用的零錢陣列是arr中index 1開始及之後的陣列部分,新的目標值是aim aim ...

動態規劃 零錢兌換

問題描述 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。比如coins 1,2,5 amount 11,11 5 5 1,最終結果為3 演算法思路 本...