硬幣組合
阿新 • • 發佈:2018-07-05
硬幣 roc ons 還在 cto img lse imp water 當下,坐公交或者地鐵時大部分人都是刷卡的。不過,時至今日還在用現金支付的人還是比想象的多。本題我們以安置在公交上的零錢兌換機為背景。
這個機器可以用紙幣兌換到 10 日元、50 日元、100 日元和 500 日元硬幣的組合,且每種硬幣的數量都足夠多(因為公交接受的最小額度為 10 日元,所以不提供 1 日元和 5 日元的硬幣)。
兌換時,允許機器兌換出本次支付時用不到的硬幣。此外,因為在乘坐公交時,如果兌換出了大量的零錢會比較不便,所以只允許機器最多兌換出 15 枚硬幣。譬如用 1000 日元紙幣兌換時,就不能兌換出“100 枚 10 日元硬幣”的組合( 圖5 )。
問題
求兌換 1000 日元紙幣時會出現多少種組合?註意,不計硬幣兌出的先後順序。
這個機器可以用紙幣兌換到 10 日元、50 日元、100 日元和 500 日元硬幣的組合,且每種硬幣的數量都足夠多(因為公交接受的最小額度為 10 日元,所以不提供 1 日元和 5 日元的硬幣)。
兌換時,允許機器兌換出本次支付時用不到的硬幣。此外,因為在乘坐公交時,如果兌換出了大量的零錢會比較不便,所以只允許機器最多兌換出 15 枚硬幣。譬如用 1000 日元紙幣兌換時,就不能兌換出“100 枚 10 日元硬幣”的組合( 圖5 )。
問題
求兌換 1000 日元紙幣時會出現多少種組合?註意,不計硬幣兌出的先後順序。
package main import "fmt" const ( coin10 = 10 coin50 = 50 coin100 = 100 coin500 = 500 ) func mostCount(money, coinDeno int)int{ mostC := money / coinDeno if mostC > 15{ return 15 }else{ return mostC } } func main(){ money := 1000 coin10MostCount := mostCount(money, coin10) coin50MostCount := mostCount(money, coin50) coin100MostCount := mostCount(money, coin100) coin500MostCount := mostCount(money, coin500) n := 0 for a:=0;a<=coin500MostCount;a++ { for b:=0;b<=coin100MostCount;b++{ for c:=0;c<=coin50MostCount;c++{ for d:=0;d<=coin10MostCount;d++{ if 500*a + 100*b + 50*c + 10*d == money && a + b + c + d <= 15{ fmt.Printf("%d = 500*%2d + 100*%2d + 50*%2d + 10*%2d\n", money, a, b, c, d) n++ } } } } } fmt.Println("共", n, "種組合") }
結果:
1000 = 500* 0 + 100* 5 + 50*10 + 10* 0 1000 = 500* 0 + 100* 6 + 50* 8 + 10* 0 1000 = 500* 0 + 100* 7 + 50* 6 + 10* 0 1000 = 500* 0 + 100* 8 + 50* 4 + 10* 0 1000 = 500* 0 + 100* 9 + 50* 1 + 10* 5 1000 = 500* 0 + 100* 9 + 50* 2 + 10* 0 1000 = 500* 0 + 100*10 + 50* 0 + 10* 0 1000 = 500* 1 + 100* 0 + 50* 9 + 10* 5 1000 = 500* 1 + 100* 0 + 50*10 + 10* 0 1000 = 500* 1 + 100* 1 + 50* 7 + 10* 5 1000 = 500* 1 + 100* 1 + 50* 8 + 10* 0 1000 = 500* 1 + 100* 2 + 50* 5 + 10* 5 1000 = 500* 1 + 100* 2 + 50* 6 + 10* 0 1000 = 500* 1 + 100* 3 + 50* 3 + 10* 5 1000 = 500* 1 + 100* 3 + 50* 4 + 10* 0 1000 = 500* 1 + 100* 4 + 50* 0 + 10*10 1000 = 500* 1 + 100* 4 + 50* 1 + 10* 5 1000 = 500* 1 + 100* 4 + 50* 2 + 10* 0 1000 = 500* 1 + 100* 5 + 50* 0 + 10* 0 1000 = 500* 2 + 100* 0 + 50* 0 + 10* 0 共 20 種組合
貌似復雜,做起來其實不難,把各種情況都讓計算機試一遍就好了。
硬幣組合