整数的拆分
来源:互联网 发布:王小帮淘宝创业故事 编辑:程序博客网 时间:2024/05/16 06:11
1.问题提出
整数s的拆分是把s分成为某些指定正整数之和,拆分式中不允许零数重复,且不记零数的次序。试求s共有多少个不同的拆分式?展示出s的所有这些拆分式。
2.递归设计
注意到拆分与式中各零数的排列顺序无关,我们考虑从1~m这m个数中取k(k<m)个数的所有组合结果入手:设comb(int m, int k)为从1~m这m个数中取k个数的所有组合结果。
当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1个数的组合。这就把从m个数中取k个数的组合问题转化为从m-1个数中取k-1数的组合问题。
设置数组a[]存放救出的组合数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[]的一个组合输出。第一个数可以是m, m-1, ..., k,函数将确定组合的第一个数字放入数组后,有两种选择:还未确定组合的其余元素时,继续递归确定组合的其余元素;已确定组合的全部元素时,输出这个组合。
对于给定的和数s与最大零数m,首先计算拆分式中零数的最少个数wmin与零数的最多个数wmax,显然,拆分式中零数的个数k取在区间[wmin,wmax]中。
建立三参数m、k、s的递归函数comb(m,k,s),当选取的第一个数i选定时,其后的数字是从余下的i-1个数中取k-1个数的组合。对所选取的k个数,求其和t并与和数s进行比较:若t=s,即找到一个拆分式,进行打印输出,并设置变量n统计拆分式的个数。
3.代码
二、可以重复的所有情况
1.递推计算分划种数
⑴递推关系的确定
设n的“最大零数不超过m” 的分划式个数为q(n, m),这里m<=n,则
q(n,n)=1+q(n, n-1)
等式右边的“1”表示n等于n本身;q(n,n-1)表示n的所有其他分划,即最大零数不超过n-1的分划。
q(n,m)=q(n,m-1)+q(n-m,m) (1<m<n)
其中q(n,m-1)表示零数中不包含m的分划式数目;q(n-m,m)表示零数中包含m的分划数目,因为如果确定了一个分划的零数中包含m,则剩下的部分就是对于n-m进行不超过m的分划。
注意:如果n-m<m时,取q(n-m,m)=q(n-m,n-m),初始条件:q(n,0)=0, q(1,m)=1
2.程序实现
- 整数的拆分
- ecnu1009 - 整数的拆分
- 整数的拆分问题
- 整数的加法拆分
- 整数的拆分问题
- 整数的拆分1
- 整数的拆分2
- 整数的拆分3
- 整数的拆分
- 整数的拆分
- c++ 实现整数的拆分
- 2173: 整数的lqp拆分
- 寒假21:整数的拆分
- 整数的素数对拆分
- 2173: 整数的lqp拆分
- 整数拆分
- 整数拆分
- 整数拆分
- size_type value_type类型:
- HTC xv6900
- class view视图中类消失的解决方法
- opengl 不同面贴不同的纹理
- 正在进行中。。。
- 整数的拆分
- JS添加收藏和设为首页代码【PHPWIND】
- eclipse无法编译android故障排除
- 我儿子的第一次创作!
- adb使用简介
- apache mina 自定义协议
- How to add a new keycode in android
- VS2005 C# WebForm 中Gridview 导出数据到Execl 或Word常见问题及解决办法。
- zen-cart 后台设置汇总一