お釣りの札と硬貨の枚数をもとめたい


お釣りの札と硬貨の枚数をもとめたいです。Rubyで解きたいのですがやり方がわかりません。

468円の買い物をして1万円札を出したときの実行結果は以下の通りになります。

[code]

    五千円札の枚数   = 1
    千円札の枚数     = 4
    五百円玉の枚数   = 1
    百円玉の枚数     = 0
    五十円玉の枚数   = 0
    十円玉の枚数     = 3
    五円玉の枚数     = 0
    一円玉の枚数     = 2
    
[/code]




「用意された種類のお金を組み合わせて x 円払いたい。お金の枚数を最小にしつつ払うにはどれを何枚払えば良いだろうか？」という問題を解くことを考えます
(どんな枚数でも良いのなら、1 円玉をたくさん払えば良くなってしまいます)。

ご提示のような種類のお金の場合、これは貪欲法で求めることができます。つまり、額面の大きな種類のお金で払えるだけ払ってしまい、払えなくなったら次に大きな種類のお金で払うことを考えていけば良いです。これで良いことの証明はここに書くには長いので省略しますが、興味があれば投稿末尾にリンクしたページをご覧ください。

部分的な例として「x 円払うのに、5000 円札で払えるだけ払うと 5000 円札を何枚使って、その後何円残るか」を計算する Ruby
のコードを示しておきます。

[code]

    $ irb
    irb(main):001:0> x = 9532              # 今払いたいお金が変数 x に代入されているとします。
    => 9532
    irb(main):002:0> n5000 = x / 5000      # 5000 円札何枚まで払えるかは、整数として割り算をすれば分かります。ここでは変数 n5000 に代入してみます。
    => 1
    irb(main):003:0> x = x - 5000 * n5000  # 残金は、上で求めた枚数分の金額を引けば分かります。
    => 4532
    
[/code]

尚、硬貨の種類によっては貪欲法で解けないことがあるので注意してください。より詳細な情報は以下のサイトが参考になるかと思います (「硬貨
貪欲法」などで検索すると出てきます)。

  * [硬貨の問題が貪欲法で解けるための条件](https://qiita.com/s417-lama/items/0cdd95fddb2067876896) \-- Qiita
  * [欲張り法 (greedy strategy)](http://www.geocities.jp/m_hiroi/light/pyalgo22.html) \-- M.Hiroi's Home Page
  * [Change-making problem](https://en.wikipedia.org/wiki/Change-making_problem) \-- 英語版 Wikipedia

