多重集组合数 [dp] 《挑战程序设计竞赛》2.3

问题描述:

n 种物品,第 i 种物品有 ai 个。不同种类的物品可以相互区分但是相同的种类无法区分。从这些物品中取出 m 个的话,有多少种取法?

为了防止重复计数,同一类的物品最好一次性处理好. 于是我们定义:

f[i][j]=ij

为了从前i种物品中选取j个,我们可以先从前i-1种物品中选取j-k个,然后在从第i个物品中补上剩下的k个
所以可以得到以下递推关系:

f[i][j]=k=0min(j,ai)f[i1][jk]

复杂度为 O(nm2) , 略高呀
不过我们有巧妙的改进方法!

我们求 f[i][j] 的时候可以使用 f[i][j1] 计算过的值,避免重复枚举 k .
因为:
f[i][j]=f[i1][j]+f[i1][j1]+...+f[i1][jai] ,
f[i][j1]=f[i1][j1]+...+f[i1][jai1]

所以:
f[i][j]=f[i][j1]+f[i1][j]f[i1][jai1]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值