1. 程式人生 > >硬幣組合

硬幣組合

硬幣 roc ons 還在 cto img lse imp water

當下,坐公交或者地鐵時大部分人都是刷卡的。不過,時至今日還在用現金支付的人還是比想象的多。本題我們以安置在公交上的零錢兌換機為背景。
這個機器可以用紙幣兌換到 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 種組合

貌似復雜,做起來其實不難,把各種情況都讓計算機試一遍就好了。

硬幣組合