划分数

看了挑战程序设计竞赛的DP部分中的划分数问题,刚开始真是云里雾里,有些字母的写法太过于高端,以至于不能理解,经过了半小时之多的认真思考与研究,终于给搞明白了。

原题大概是这样的:
有N个无区别的物品,将他们划分成不超过M组,求出划分方法数模Mod的余数

  • 1≤M≤N≤1000
  • 2≤Mod≤10000

sample input:
N = 4,M=3, Mod = 10000;
sample output:
4 (1+1+2 = 1+ 3 = 2+2 =4);

dp[i][j]:= j的i划分的总数。

然后书中给出动态规划方程:

dp[i][j] = dp[i][j-i] + dp[i-1][j]

这里直接借助上边这个题目给出思路:

首先对于j的i划分总数,比如 4 (1+1+2 = 1+ 3 = 2+2 =4),即为4的3划分总数,
可以看作是 4(1+1+2 = 0+1+3=0+2+2=0+0+4),那么对于i的j划分,这其中的划分方式,可以分为,不包括数字0的和包括数字0的,那么对于不包括数字0的,该划分方式中一定有j个数,如该题,不包括数字0的即为1+1+2,数字的个数即为3,那么将该方式中的每个数字减去1,就得到了,i-j的j划分,如该题,4-3的3划分即为(1-1)+(1-1)+(2-1) => 0+0+1 ,对于其他数字较大的,该方式同样适用,可以举例子证明下。而对于包括数字0的,每一种划分去掉一个0,就变成了i的j-1划分,即为 4的2划分 => (1+3 = 2+2=0+4)那么4的3划分,即为4-3 的3划分加上4的2划分。
所以得到dp公式:

dp[i][j] = dp[i][j-i] + dp[i-1][j]  

(dp[i][j] = dp[i-1][j] =...=dp[j][j]          j<i)

写的比较混乱,希望日后再看的时候能够看懂 - -;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值