1. 貪欲なアルゴリズム
貪欲アルゴリズムは貪欲アルゴリズムとも呼ばれます。貪欲なアルゴリズムとは、問題を解決するときに、現時点で最善と考えられる選択を常に行うことができることを意味します。つまり、全体の最適性を考慮せず、ある意味での局所的な最適解だけを作ることになる。これは、最適解の問題のほとんどが 1 つずつサブ問題に分割できるという点で動的計画アルゴリズムに似ています。貪欲アルゴリズムと動的計画アルゴリズムの違いは、動的計画アルゴリズムは問題全体に対する最適な解を取得し、それぞれの結果が将来の結果に影響を与えることです。ただし、毎回の貪欲アルゴリズムの結果は将来の結果には影響せず、当面の問題のみが考慮されます。貪欲なアルゴリズムは問題解決の戦略が近視眼的であり、現在入手可能な情報のみに基づいて選択を行い、一度選択すると、将来どのような結果になってもその選択は変わりません。例えば、水を抜いてから魚を獲るというのは、水を抜いてから魚を獲るということであり、長期的な利益を無視し、目先のことだけを考えた貪欲な行動です。ある意味、貪欲アルゴリズムは動的計画法アルゴリズムの特殊なケースです。
2. 貪欲なアルゴリズムを使用する
スーパーには小銭が置いてあるのが普通ですが、硬貨には10セント、50セント、1元、5元、10元、20元、50元、100元などの種類があります。顧客のお釣りを求める場合、お釣りの組み合わせはたくさんありますが、この問題ではコインの枚数が最も少ない解を選択する必要があります。したがって、このセクションで解決すべき問題は、ユーザーが両替が必要な金額を入力するときに、最小のコイン数で解を見つけることです。
分析: できるだけ額面の大きいコインを選択します。たとえば、合計釣銭額 80 を額面 100 で割ります。商をとった後の整数は 0 になります。これは、100 が 80 より大きいことを意味します。額面 100 元の硬貨を見つける。
変更の問題を実現するための具体的なコードは次のとおりです。
def change():
d = [0.01,0.02,0.05,0.1,0.2,0.5,1.0] # 存储每种硬币的面值
d_num = [] # 存储每种硬币的数量
s = 0
# 拥有的零钱总和
temp = input('请输入每种零钱的数量:')
d_num0 = temp.split(" ") # 用空格将每种零钱数量分割
for i in range(0, len(d_num0)): # 遍历每个空格
d_num.append(int(d_num0[i])) # 给存储硬币数量列表补充空格
s += d[i] * d_num[i] # 计算出收银员拥有多少钱
sum = float(input("请输入需要找的零钱:"))
if sum > s:
# 当输入的总金额比收银员的总金额多时,无法进行找零
print("数据有错")
return 0
s = s - sum # 收银员的总金额减去输入的总金额
# 要想用的钱币数量最少,那么需要利用所有面值大的钱币,因此从数组的面值大的元素开始遍历,贪心算法开始
i = 6 # 列表最大坐标
while i >= 0: # 循环找零
if sum >= d[i]: # 输入的总金额大于或等于每个零钱面值数,才进行找零
# 用输入的总金额从列表的最后一个元素开始整除取商,计算的是找每种面值的个数
n = int(sum / d[i])
if n >= d_num[i]: # 如果计算n大于或等于每个面值个数
n = d_num[i] # 更新n
sum -= n * d[i] # 贪心的关键步骤,令sum动态的改变
print("找了%d个%.2f元硬币"%(n, d[i])) # 输出需要找每种面值的情况
i -= 1 # 改变i的值用来结束循环
change() # 直接调用函数