动态规划解整数划分

算法思路:

n = n1 + n2 + n3 + n4 + .... + nk
(n1>=n2>=n3>=....>=nk),从大到小排列后,可以避免陷入数值大小排序顺序的困境中。这样,在下面的过程,我们可以并不关心数值大小的排列,只关心组合方案数。

状态表示:将最大加数n1不大于m的划分个数记作q(n,m)
状态转移:
(1) q(n,1) = 1,n>=1
当最大加数n1不大于1时,任何正整数n只有一种划分方式,即 n = 1+1+1+..+1 (n个1相加)。
(2)q(n,m) = q(n,n),m>n
最大加数n1实际上不能大于n。因此q(1,m)=1。
(3)q(n,n) = 1+q(n,n-1)
正整数n的划分由n1=n的划分和n1<=n-1的划分组成。
(4)q(n,m) = q(n,m-1) + q(n-m,m),n>m>1
正整数n的最大加数n1不大于m的划分由n1=m的划分和n1<=m-1的划分组成。


另一个思路有点相似的问题:

1-100中,   
求:5个不同数的和小于100的不重复组合的个数.   


设立一个数组A[5][100][100]
A[i][j][k]表示用i个[j, 100]之间的不同的数,最小数为j且和小于k的组合有多少种
//假设数组下标从1开始
则有
A[i][j][k] = SIGMA{ A[i-1][m][k-j] } m属于[j+1, k]


e.g.
A[5][1][100]
表示所求组合中,最小的那个数为1的情况
那么其余四个数中最小的至少是2,并且那四个数和小于99
所以A[5][1][100] = A[4][2][99] + A[4][3][99] + ...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值