问题描述:
有 n 种物品,第
i 种物品有 ai 个。不同种类的物品可以相互区分但是相同的种类无法区分。从这些物品中取出 m 个的话,有多少种取法?
为了防止重复计数,同一类的物品最好一次性处理好. 于是我们定义:
为了从前i种物品中选取j个,我们可以先从前i-1种物品中选取j-k个,然后在从第i个物品中补上剩下的k个
所以可以得到以下递推关系:
f[i][j]=∑k=0min(j,ai)f[i−1][j−k]
复杂度为
O(nm2)
, 略高呀
不过我们有巧妙的改进方法!
我们求
f[i][j]
的时候可以使用
f[i][j−1]
计算过的值,避免重复枚举
k
.
因为:
f[i][j−1]=f[i−1][j−1]+...+f[i−1][j−ai−1]
所以:
f[i][j]=f[i][j−1]+f[i−1][j]−f[i−1][j−ai−1]