Python greedy アルゴリズムがレジ係のつり銭問題を解決

シーンの説明

        スーパーで会計をするとき、1セント、5セント、1セント、3セント、5セント、1元の硬貨しかないと仮定して、両替が必要な場合は、両替が必要な枚数を出すので、レジ係が顧客に与えるコインの数が最小になるようにするには、図に示すようにプログラムを実行します。

知識の補足

        貪欲なアルゴリズムは、現在の問題を解決する際に、現在の最良の選択、つまり局所最適解が常に行われることを意味します。貪欲な戦略を使用することは、後効果がないこと、つまり、特定の状態の後のプロセスが前の状態に影響を与えないことを保証する必要があり、同時に、ローカル最適戦略はグローバル最適解を生成できます。

貪欲アルゴリズムの一般的な解決手順は次のとおりです。

        1. 問題を記述する数学的モデルを確立する;
        2. 解決すべき問題をいくつかのサブ問題に分割する;
        3. 各サブ問題を解決して、サブ問題の局所最適解を得る;
        4. 局所最適解を結合する副問題を元の問題に解決することは、問題の解決策です。

関数関数を定義する

レジ係が持っているコインの数を初期化する

        入力によって各種類の釣り銭の金額を取得し、レジ担当者が持っている釣り銭の合計金額を定義し、釣り銭が不可能になるのを防ぎ、各金種の硬貨の枚数を決定します。

"""
    通过输入获取总零钱
"""
def new_coin():
    print("=====收银员总零钱统计=====")
    coin = [0.01, 0.05, 0.1, 0.5, 1.0]
    coin_num = []
    sum = 0
    for index, i in enumerate(coin):
        num = int(input('收银员{}面值硬币有几个?'.format(i)))
        coin_num.append(num)
        sum += i * num
    print("收银员总零钱数:{0}".format(sum))
    return sum, coin, coin_num

書き込み変更

        最大の硬貨の金種から始めて、この種類の金種でどれだけのお金を両替できるかを計算します.各種類の金種の両替硬貨の数は副問題であり、同時に合計を最小化するという目標を達成するために集計します.コイン数。

""" 
    计算找零 
"""
def change(sum, coin, coin_num):
    print('==========找零==========')
    s = float(input("请输入要找零金额:"))
    # 找零比收银员总零钱数大
    if s > sum:
        print("收银员零钱不够!")
    else:
        # 贪心算法要总硬币数最少,从最大面值开始找零
        i = len(coin) - 1
        while i >= 0:
            if s >= coin[i]:
                n = int(s / coin[i])
                if n > coin_num[i]:
                    n = coin_num[i]
                #贪心算法 动态改变找零总值
                s -= n * coin[i]
                print("用了{0}面值的硬币{1}个".format(coin[i], n))
            i -= 1
        print("找零结束!")

完全なコード実装


"""
    通过输入获取总零钱
"""
def new_coin():
    print("=====收银员总零钱统计=====")
    coin = [0.01, 0.05, 0.1, 0.5, 1.0]
    coin_num = []
    sum = 0
    for index, i in enumerate(coin):
        num = int(input('收银员{}面值硬币有几个?'.format(i)))
        coin_num.append(num)
        sum += i * num
    print("收银员总零钱数:{0}".format(sum))
    return sum, coin, coin_num


""" 计算找零 """
def change(sum, coin, coin_num):
    print('==========找零==========')
    s = float(input("请输入要找零金额:"))
    # 找零比收银员总零钱数大
    if s > sum:
        print("收银员零钱不够!")
    else:
        # 贪心算法要总硬币数最少,从最大面值开始找零
        i = len(coin) - 1
        while i >= 0:
            if s >= coin[i]:
                n = int(s / coin[i])
                if n > coin_num[i]:
                    n = coin_num[i]
                #贪心算法 动态改变找零总值
                s -= n * coin[i]
                print("用了{0}面值的硬币{1}个".format(coin[i], n))
            i -= 1
        print("找零结束!")


if __name__ == '__main__':
    print("============收银员找零================")
    sum, coin, coin_num = new_coin()
    change(sum, coin, coin_num)

PS: 個人的な理由により、長い間中断されており、今日は以前の更新をゆっくりと取り上げます。

いいね、収集、コメント欄へのコメントを歓迎し、ソースを示すために転載してください。

おすすめ

転載: blog.csdn.net/qq_52213943/article/details/127733687