考虑设 fi,j 表示现在有 i 个元素和为 j 的方案数,考虑怎么转移。
我们可以在原来的序列前面添加一些 0 或者将所有的元素全部加 1,显然这样可以做到将所有的情况全部考虑。
所以对于 m→∞ 的情况,就直接:
fi,j=fi−1,j+fi,j−i
对于有 m 的限制的情况,其实就是限制了不能使劲添加 0,那么就设一个 gi,j 表示序列里不含有 0 的贡献,那么就有:
fi,j=fi,j−i+k=1∑min(m,i)gi−k,j,gi,j=fi,j−i
使用前缀和优化,之间复杂度为 O(n2)。