いわゆるアリ本1で、非常に日常的な問題の解法として貪欲法が紹介されていた が、なぜ貪欲法で厳密解が求まるのかわからなかったので考えてみた。

硬貨の問題

1円玉、5円玉、10円玉、50円玉、100円玉、500円玉が、それぞれ C1, C5, C10, C50, C100, C500枚ずつあります。できるだけ少ない枚数の 硬貨でA円を支払いたいと考えています。何枚の硬貨を出す必要があるでしょ うか?なお、そのような支払い方は少なくとも1つは存在するとします。2


まず、A円を最少の硬貨で払う問題は、①A円以下で(手持ちの硬貨のある)最 大の額面金額Bを最少の硬貨で払う問題と、②(A-B)円を最少の硬貨で払う問 題に分割できます。

なぜかと言うと、A円を払う硬貨の組み合わせは、設定された額面金額の性質 (ある額面についてそれより小さな額面に、約数でない物が存在しない)から、 必ずちょうどB円になる部分を含むからです。

A円になる硬貨の任意の組み合わせを大きい硬貨から並べて、足した金額がB 円以上になったところで辞める事にします。そうするとどのような額面金額C の硬貨が足された時にB円以上になったとしても、その直前の金額はC円玉か、 それよりも大きな(Cの倍数額面の)硬貨0枚以上で成り立っているので、C の倍数になります。したがって、実はC円玉を足す直前の金額は(B-C)円 で、B円以上というのはちょうどB円だったことになります。

B円を払う最少の硬貨の組み合わせはB円玉1つからなることは自明ですから、 これが1つ目の部分問題に対する最適解になります。

A円を払う最少の硬貨の組み合わせがB円玉を含まなかったとしたらどうでしょ うか? 先の議論から、そのような組み合わせはちょうどB円になる部分を含 むことになります。しかし、これはB円玉1つで置き換えて、全体の枚数を少 なくすることができます。(この置き換えはB円玉以外を使いませんので、他の 部分の実現可能性に影響しませんから、常に可能です。)

最少の硬貨の組み合わせのはずだったのに、より少ない硬貨の組み合わせを作 ることができてしまいました。よって、B円玉を含まない最少の硬貨の組み合 わせは存在せず、額面金額Bの硬貨がある場合、A円を払う最少の硬貨の組み 合わせはそのB円玉を含みます。

A円を最少の硬貨で払う問題の最適解が、B円を最少の硬貨(つまりB円玉1 枚)で払う問題と、(A-B)円を最少の硬貨で払う問題のそれぞれの最適解 から成り立っていることになります。よって、部分問題最適性が満たされるこ とになり、繰り返し「B円」を選ぶ貪欲法で厳密解が求まることがわかります。


多分こんな感じ。

  1. 秋葉 拓哉、岩田 陽一、北川 宜稔、「プログラミングコンテストチャレンジブック 第2版」、毎日コミュニケーションズ、2010年。 

  2. 同上、42ページ。