正整数n的k拆分问题

本文探讨了整数拆分问题的解决方法,即将一个正整数拆分成若干个不同整数之和的不同方式的数量。通过递推公式opt[i][j] = opt[i][j-1] + opt[i-j][j]进行计算,其中opt[i][j]表示把i拆成j个数的方法数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法小菜鸟刚开始做POJ,1664是一个关于整数拆分的问题,即:

将正整数n拆分成k个不能整数的和,0<=k<=n,求有多少种差分方法。

比如:将7差分成3个不同整数的拆分法有8中,其中1,1,5和1,5,1属于同一种拆分法。

该问题等同于:

将n个完全相同的物品放到k个完全相同的容器中,求有多少种方法。

 

由于小菜鸟数学不好,感觉是用递推,但总是写不出正确的递推公式,于是google之:

http://hi.baidu.com/roba/blog/item/566f5bb58525d5cc37d3ca42.html/cmtid/eb5d6b63afb0c86a0c33fa97

如果我们用opt[i][j]表示把i拆成j个数(可为0)的方法数,则有如下方程成立:
opt[i][j] = opt[i][j-1] + opt[i-j][j]

边界条件opt[0][j] = 0

解释为,

             (1)要么第j个数为0,这样就是opt[i][j-1],(存在被分配数为0的j)

             (2)要么所有的j被分配数都大于0(最小的j被分配的数大于0),我们可以把所有j个数都减1,于是得到opt[i-j][j]。

等同于:

①最少的盘子没有放,这样剩下的k-1个盘子还是随便放n个
②最少的盘子放了一个,这样每个盘子至少一个,k个盘子先放上k个,剩下的n-k个可以随便放

可以做到空间为O(N)。代码也很好写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值