30 lines
1.0 KiB
Markdown
30 lines
1.0 KiB
Markdown
|
|
找一组数字进行模拟
|
||
|
|
|
||
|
|
$n=5$
|
||
|
|
$a=3$
|
||
|
|
$b=2$
|
||
|
|
$c=1$
|
||
|
|
|
||
|
|

|
||
|
|
|
||
|
|
由此可以整理动态规划的信息如下:
|
||
|
|
|
||
|
|
- 状态表示: $f[i]$ 表示从 $i$ 到 $0$ 的方案数
|
||
|
|
- 状态转移: $f[i] = f[i-a] + f[i-b]$
|
||
|
|
- 初始状态: $f[n] = 1$
|
||
|
|
|
||
|
|
- 目标状态: 因为最后要求是小于$c$的都是可以到达的状态,所以需要从$0$到$c$的$f[i]$进行累加
|
||
|
|
$$\sum_{i=0}^{c} f[i]$$
|
||
|
|
|
||
|
|
- 边界问题处理:
|
||
|
|
- 如果$i-a$小于$0$,则$f[i-a] = f[0]$
|
||
|
|
- 如果$i-b$小于$0$,则$f[i-b] = f[0]$
|
||
|
|
|
||
|
|
$Q:$ 为什么要处理边界问题,哪来的边界问题呢?
|
||
|
|
$A:$ 通过上面的数字模拟会发现,$2$可以继续减$3$而到达$-1$,这种转换路径是有效,但结果是$-1$,用数组下标来存储显然是不合适的,所以需要处理边界问题。
|
||
|
|
我们可以把这样的情况统统的保存汇集到$0$,这样就保证了数组下标是正的。
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|