【错解】
哎(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} imes 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}} imes A_{v_{2}})
首先预处理凑出每种硬币对应价值有多少种方案
①自己动手,丰衣足食
即(A_{i})的最大为i,j不超过i(废话)的方案数为1
②从前面凑出来
(A_{i}=A_{i-1} ^{frac{v[i]}{v[i-1]}})
两者相加
然后从大往小跑,每次尽量取完,因为已经包含更小的情况,所以没有遗漏
搞个矩阵快速幂就好了