題目連結:
題目大意:
第一列給定一正整數 T ( 1 ≦ T ≦ 1, 000, 001 ),代表接下來有T列的輸入。
每一列的輸入包含一正整數 N ( 0 ≦ N ≦ 2, 000, 000, 000 ),代表要帶 N 塊錢。
而現在有 1、5、10、30、50、70、100、110、500、1000 塊面額的硬幣,求要湊到 N 塊錢所需的最少硬幣數量為何?
範例輸入:
3
30
140
250
範例輸出:
1
2
3
解題思維:
乍看之下像是一題非常一般的DP題。但是由於N實在太大,建表不實際,而輸入時才求解也是不大明智的選擇。
因此我們可以想辦法降低需要求解的範圍。經過一番思考,我們可以發現當 N ≧ 1000 ,最佳的方法數必定為:
Floor(N / 1000)+( N mod 1000 )之方法數。
其中,Floor()代表將結果取下高斯(對正數來說,無條件捨去;負數則為無條件進位)。因為如果不用 1000 塊的話,想要快速逼近 N 塊錢就必須要至少兩個 500 塊,但是兩個 500 塊可以替換成一個 1000 塊,因而造成上式的結果。
相似地,我們也可以求出當 500 ≦ N < 1000 時,方法數為:
Floor(N / 500)+( N mod 500 )之方法數。
其中的理由跟上面相同。
經過以上篩選後,真正需要算的範圍也只剩下 N < 500 以下了,此時就可以套用
之前的文章提到過的方法去DP。最後只要每輸入一次 N 就進行以上的關係式,再加上取完餘數(值必定介於 0 ~ 499 之間)相應的方法數即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。