目的

できるだけ少ない枚数で指定された金額を支払う場合,何枚になるか.
貪欲法

利点は単純で計算速度が速く,最善の定義を問題に対して適切に設定するとそれなりに良い解が得られる.
貪欲法の問題への適用
単純に500円玉から順に使っていくだけ.



プログラム
package main
import (
"fmt"
"bufio"
"os"
"strconv"
"strings"
)
// Standard Input Function
func Scan() string {
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
return strings.TrimRight(input, "\n")
}
// Min
func Min(v1, v2 int) int {
if v1 > v2 { return v2
} else { return v1 }
}
func Solve(amount int, values [6]int, limits []int) int {
answer := 0
for i := 5; i >= 0; i-- {
num := Min(amount / values[i], limits[i])
amount -= num * values[i]
answer += num
}
return answer
}
func main() {
coinValue := [6]int{1, 5, 10, 50, 100, 500}
coinLimit := make([]int, 6)
fmt.Printf("Please input total amount to pay:")
amount,_ := strconv.Atoi(Scan())
for i := 0; i < 6; i++ {
fmt.Printf("Please input limit number of %d yen:", coinValue[i])
coinLimit[i], _ = strconv.Atoi(Scan())
}
fmt.Printf("Answer : %d\n", Solve(amount, coinValue, coinLimit))
}
実行結果
Please input total amount to pay:620 Please input limit number of 1 yen:3 Please input limit number of 5 yen:2 Please input limit number of 10 yen:1 Please input limit number of 50 yen:3 Please input limit number of 100 yen:0 Please input limit number of 500 yen:2 Answer : 6