您好,登錄后才能下訂單哦!
當下,坐公交或者地鐵時大部分人都是刷卡的。不過,時至今日還在用現金支付的人還是比想象的多。本題我們以安置在公交上的零錢兌換機為背景。
這個機器可以用紙幣兌換到 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 種組合
貌似復雜,做起來其實不難,把各種情況都讓計算機試一遍就好了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。