切換
舊版
前往
大廳
主題

ZeroJudge - d904: 換零錢 解題心得

Not In My Back Yard | 2018-11-03 13:42:01 | 巴幣 5 | 人氣 1867

題目連結:


題目大意:
給定兩個正整數 C (介於 1 ~ 1, 000 )、 N (介於 1 ~ 10 ),接下來會有 N 個硬幣的面額( C 跟硬幣面額的單位都是美分)。

求使用那 N 種硬幣湊出 C 美分的可能的最少硬幣數。(可以假定 C 一定是這 N 種硬幣所組成)


範例輸入:
93 5
25
50
10
1
5



範例輸出:
7



解題思維:
觀察以下圖表:

引進面額 1 的時候,大家的最少硬幣方法數就是自己的金額。

當引進面額 2 的時候,可以發現金額 ≧ 2 都發生了一些改變。因為例如金額 M = 15 ,它現在最少的方法數可以從 15 - 2 = 13 的方法數 + 1 得來;而 M = 13 ,又可以從 13 - 2 = 11 的方法數 + 1 得來,以此類推。

引進面額 5 的時候,也發生了類似面額 2 的事情。

所以我們可以發現,我們可以藉由 DP 的思維來完成此題的要求。

每引進一個硬幣面額 P ,則對於所有金額介於 P ~ C ( C 是題目的所求金額)的 M 值,他們的最少硬幣數可以從以下式子得知:
M 的硬幣數 = M - P 的硬幣數 + 1 跟  M 先前最少的硬幣數,兩者取最小值。

因此每輸入進一個新面額,我們就可以用迴圈去跑 P ~ C 做一次上面的式子,去更新硬幣數。

最後,再看 C 現在的硬幣數,即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

JamesLeeee
我還太嫩ㄌ
剛剛用開了一個101 * 50001的陣列
直接return -1
每次輸入就做一次運算也太聰明
2019-04-26 01:56:05

更多創作