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 → stdout
输入 stdin
CtrlShiftEnter
输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字