問題:給你 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 演算法思路 本...