第一行一个整数n( n ≤ 10000 ),表示需找零的金额。 第二行一个整数m( m ≤ 100 ),表示硬币面值的个数。 第三行为m个整数,表示m个硬币的面值d1<d2<…<dm,其中d1=1。 【输出形式】 找零所需的数量最少的硬币数目。
时间: 2024-02-23 22:00:58 浏览: 137
这是一个经典的动态规划问题,可以使用贪心算法求解。
首先,将硬币面值从大到小排序,然后从大到小依次尝试用面值最大的硬币去找零。如果当前硬币面值大于等于剩余需要找零的金额,则将该硬币个数加上剩余需要找零的金额除以当前硬币面值的商,即可得到所需硬币的最小数量。
代码如下:
```python
n = int(input()) # 需找零的金额
m = int(input()) # 硬币面值的个数
coins = list(map(int, input().split())) # 硬币面值
count = 0 # 硬币数量
for i in range(m-1, -1, -1):
if coins[i] <= n:
count += n // coins[i]
n %= coins[i]
if n == 0:
break
print(count)
```
如果硬币面值不是特殊的,比如面值为1、2、5、10、20、50、100,那么就需要使用动态规划求解。具体做法是定义一个长度为n+1的数组dp,其中dp[i]表示找零i元所需的最少硬币数目。初始化dp[0]=0,其余元素均为正无穷大。然后依次枚举硬币面值,对于每个面值,再枚举需要找零的金额,更新dp数组。
代码如下:
```python
n = int(input()) # 需找零的金额
m = int(input()) # 硬币面值的个数
coins = list(map(int, input().split())) # 硬币面值
dp = [float('inf')] * (n+1)
dp[0] = 0
for i in range(m):
for j in range(coins[i], n+1):
dp[j] = min(dp[j], dp[j-coins[i]] + 1)
print(dp[n])
```
阅读全文