找一组数字进行模拟 $n=5$ $a=3$ $b=2$ $c=1$ ![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202501211453606.png) 由此可以整理动态规划的信息如下: - 状态表示: $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$,这样就保证了数组下标是正的。