B3635 硬币问题 題解
ShanCreeperPro · · 题解
B3635 硬币问题 題解
管理员注:
阅读本文章前,请先阅读
如需系统学习相关知识点请报名【洛谷-基础算法计划】
究极无敌典中典之入门 dp 问题。
有面值 1 5 11 的三种硬币,问凑出
尝试贪心,尽可能先用大面额,不够再用小面额。
但这是错误的,例如凑 15 元,贪心方法是
首先,假设我们知道:
- 凑14元至少要4枚硬币;
- 凑10元至少要2枚硬币;
- 凑4元至少要4枚硬币。
那么要凑 15 元的话:
- 先拿 1 元,还要 14 元,即总共要 5 枚;
- 先拿 5 元,还要 10 元,即总共要 3 枚;
- 先拿 11 元,还要 4 元,即总共要 5 枚。
所以,只要我们知道了凑 14,10,4 元需要多少硬币,我们不需要其他条件就能求出最少方案。
所以,我们能得出:
用小问题的解,求大问题的解。
这是一个 dp 的基本思路。
结论
要解决凑
代价:凑足
所以,凑
所以,求
表格法:
用
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | 5 | 2 | 1 | 2 | 3 | 4 | 3 |
那么,代码实现就如下:
-
首先开
f 数组,存储f(n) 的结果; -
-
从 1 到
n 循环,其中f_i 的值为\min(f_{i-1},f_{i-5},f_{i-11}) 。 -
注意,
f_{i-5} 和f_{i-11} 可能会越界。
当然,如果你觉得判断越界不好想的话,你可以把从
时间复杂度
我们总结一下:
- dp 问题,发现只要解决几个更小规模的问题,就能得到大问题的解;
- 所以我们可以设计一张表格,每个格子代表一个问题的解;
- 根据初始信息,一步步填表格;
- 填完后,就得到了答案。