n, m = map(int, input().split()) coins = list(map(int, input().split())) # 初始化一个列表,存放从1到m元所有价格需要的最少硬币数 min_coins = [float('inf')] * (m+1) # 0元不需要硬币 min_coins[0] = 0 # 外循环遍历所有可能的价格(从小到大) for i in range(1, m+1): # 内循环尝试使用每个硬币更新最少硬币数 for j in range(n): if coins[j] <= i: current = min_coins[i-coins[j]] + 1 if current < min_coins[i]: min_coins[i] = current if min_coins[m] == float('inf'): print("No answer!!!") else: print(min_coins[m])代码详细解读
时间: 2024-04-02 12:36:45 浏览: 88
WORD.rar_coins.png_imhist_imread_matlab coins.p
这段代码是一个用于计算最少硬币数量的动态规划算法。
首先,输入包括两个整数 n 和 m,分别表示硬币的种类数和需要凑出的钱数。接着,输入一个列表 coins,包含了每个硬币的面值。
在初始化过程中,定义了一个长度为 m+1 的列表 min_coins,用于存放从 1 到 m 元所有价格需要的最少硬币数。初始时,将所有列表元素赋值为无穷大,表示这些价格无法被凑出。
然后,将 0 元的最少硬币数设置为 0。
接下来,外循环遍历从 1 到 m 的所有价格(从小到大),内循环则尝试使用每个硬币更新最少硬币数。如果当前硬币的面值小于等于当前价格 i,则可以使用这个硬币凑出价格 i。此时,可以用 min_coins[i-coins[j]] + 1 来更新当前价格 i 的最少硬币数。其中,min_coins[i-coins[j]] 表示凑出价格 i-coins[j] 的最少硬币数,加 1 则表示再加上一个硬币 coins[j]。最后,如果当前最少硬币数小于 min_coins[i],则更新 min_coins[i]。
最后,如果 min_coins[m] 仍然为无穷大,则表示无法凑出价格 m,输出 "No answer!!!"。否则,输出 min_coins[m],即凑出价格 m 所需要的最少硬币数。
阅读全文