Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで指定金額を作るために必要な最小コイン枚数を求めるプログラム


異なる額面(1、5、10、25)のコインと合計金額 amount が与えられたとき、その金額をちょうど作るために必要な最少のコイン枚数を計算する関数を定義します。たとえば入力が 64 の場合、出力は 7 になります。これは 25 + 25 + 10 + 1 + 1 + 1 + 1 = 64 という組み合わせで構成できるためです。

解法のアプローチ

この問題は動的計画法(DP)を使うことで効率的に解けます。「dp[i] = 金額 i を作るのに必要な最小コイン枚数」と定義し、小さい金額から順に値を埋めていきます。具体的な手順は以下の通りです。

  • amount が 0 の場合は 0 を返す
  • コイン配列の最小値が amount より大きい場合は -1 を返す(その金額は作れないため)
  • サイズ amount + 1 の配列 dp を定義し、すべて -1 で初期化する(-1 は「まだ作れない」ことを表す)
  • コイン配列の各要素 i について以下を繰り返す:
    • i が dp の長さ - 1 より大きい場合はスキップして次の反復へ進む
    • dp[i] := 1 とする(コイン i を 1 枚使えば金額 i が作れるため)
    • j を i + 1 から amount まで繰り返す:
      • dp[j - i] が -1 の場合はスキップして次の反復へ進む
      • それ以外で dp[j] が -1 の場合は、dp[j] := dp[j - i] + 1 とする
      • それ以外の場合は、dp[j] := min(dp[j], dp[j - i] + 1) とする
  • 最後に dp[amount] を返す

アルゴリズムのポイント

各金額 j に対して、「コイン i を 1 枚追加した場合の残り金額 j - i に必要な枚数 + 1」を候補として比較することで、重複する部分問題を一度だけ計算すれば済みます。これにより全探索に比べて計算量を大幅に抑えられ、時間計算量は O(amount × コインの種類数)、空間計算量は O(amount) となります。

実装例

以下の実装を見ると、より理解しやすくなります。

class Solution(object):
    def coinChange(self, amount):
        coins = [1,5,10,25]
        if amount == 0 :
            return 0
        if min(coins) > amount:
            return -1
        dp = [-1 for i in range(0, amount + 1)]
        for i in coins:
            if i > len(dp) - 1:
                continue
            dp[i] = 1
            for j in range(i + 1, amount + 1):
                if dp[j - i] == -1:
                    continue
                elif dp[j] == -1:
                    dp[j] = dp[j - i] + 1
                else:
                    dp[j] = min(dp[j], dp[j - i] + 1)
        return dp[amount]
ob1 = Solution()
print(ob1.coinChange(64))

入力

64

出力

7

  1. Pythonでリスト内の最小値を見つける方法を解説

    この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。

  2. Pythonでリスト内の最大値を見つける方法をわかりやすく解説

    この記事では、Pythonを使ってリストの中から最大の要素(最大値)を見つける方法について解説します。初心者の方でも理解しやすいよう、複数のアプローチをコード例とともに紹介していきます。 問題の概要 問題文: 与えられたリストの中から、最も大きい要素を求めて出力してください。 Pythonには便利な組み込み関数が用意されているため、これらを活用することで短いコードで効率的に問題を解決できます。ここでは主に sort() メソッドと max() 関数の2つの方法を取り上げます。 方法1:sort() 関数を使う sort() メソッドはリストを昇順に並べ替えます。並べ替え後のリストの末尾(インデ