【20181019T2】硬币【矩阵快速幂优化DP】

本文探讨了一个硬币凑数问题的解决方案,通过矩阵乘法优化算法,实现高效求解特定条件下凑出目标金额的方案数。介绍了如何预处理凑出每种硬币对应价值的方案数,利用矩阵快速幂技巧进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面

【错解】

\(N \leq 50\)?双向搜索?

切了切……

等下,好像要求方案数……

好像搜不了

哎他给\(V_{i} | V_{i+1}\)干嘛?

肯定有用啊

为了体现条件的用处,我在搜下一步时把后面的和S除以当前值

但还是T了啊

写了个\(O(NW^{2})\)的完全背包水水,瞎搞了个神奇算法,揉在一起,成功爆零

【正解】

\(f_{t,i,j}\)表示选的硬币编号最大为i,最小大于等于j的凑出t的方案数

这样可以完整地表示出\(f_{t,i,j}=\sum f_{t_{1},i,k} \times f_{t_{2},k,j}\)(其中\(t_{1}+t_{2}=t,j \leq k \leq i\)

哎怎么那么眼熟?

这不就是传说中的……矩阵乘法?

换一下:

设矩阵\(A_{t}\)的i行j列表示最大为i,最小大于等于j的凑出t的方案数

那么有\(A_{v_{1}+v_{2}}=A_{v_{1}} \times A_{v_{2}}\)

首先预处理凑出每种硬币对应价值有多少种方案

①自己动手,丰衣足食

\(A_{i}\)的最大为i,j不超过i(废话)的方案数为1

②从前面凑出来

\(A_{i}=A_{i-1} ^{\frac{v[i]}{v[i-1]}}\)

两者相加

然后从大往小跑,每次尽量取完,因为已经包含更小的情况,所以没有遗漏

搞个矩阵快速幂就好了

代码

转载于:https://www.cnblogs.com/lstoi/p/9818467.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值