2383. 硬币问题
1000ms
256MB
简单
动态规划
Dynamic Programming
题目描述
现有面值为 1 元、5 元、11 元的硬币各无限枚。
想要凑出总价值为 $n$ 元的金额,求所需的最少硬币数量。
输入格式
- 输入仅一行,包含一个正整数 $n$ ($1 \le n \le 10^6$)。
输出格式
- 输出仅一行,包含一个正整数,表示凑出该金额所需的最少硬币个数。
样例 1
输入 (Input)
15
输出 (Output)
3
样例 2
输入 (Input)
12
输出 (Output)
2
- 对于 $100\%$ 的数据:$1 \le n \le 10^6$。
- **样例解释**:
- 对于样例 1:最佳凑法为 $15 = 5 + 5 + 5$,使用 3 枚硬币。
- 对于样例 2:最佳凑法为 $12 = 11 + 1$,使用 2 枚硬币(若使用贪心算法可能会得出 $12 = 5 + 5 + 1 + 1$ 共 4 枚,但实际上使用 11 和 1 仅需 2 枚,因此本题不能简单地使用贪心算法)。
- **算法提示**:
这是一个经典的**完全背包/动态规划**问题。
1. 设 $dp[i]$ 表示凑出金额 $i$ 所需的最少硬币数。
2. 初始化:$dp[0] = 0$,对于 $i > 0$,将 $dp[i]$ 初始化为一个极大值(如 $\infty$)。
3. 状态转移方程:
$$dp[i] = \min(dp[i-1], dp[i-5], dp[i-11]) + 1$$
(其中只有在 $i \ge c$ 时才考虑面值为 $c$ 的硬币转移)
4. 顺序递推计算至 $n$,最终的 $dp[n]$ 即为所求。由于 $n \le 10^6$,时间复杂度为 $O(n)$,空间复杂度为 $O(n)$(占用内存约 4MB),均在安全范围内。
› 输入 stdin
CtrlShiftEnter
‹ 输出 stdout
错误 stderr
操作成功