整数划分

巡山小妖精
785次浏览
2021年01月11日 09:30
最佳经验
本文由作者推荐

庄心妍好听的歌-风采楼

2021年1月11日发(作者:陶焘)


整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
另:给出所有不同划分的情况。

例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。

输入一个正整数,给出不同的划分,并求出总数。
(赖晓晖: 如果有错误请大家批评指出, 谢谢)
思路:是以二叉树的的思路做的,(用二叉树应该也可以做,可能在输出要判断有点麻烦。)
以6为例子:分为6种情况,而每种情况又有不同的子情况。

6
6

6


4 2
1
5


1 1

(1):6 (2)5+1 (3)4+2 4+1+1




6

6

3
3

2
4

1
2

2
2


1
1
1 1
1

1

(4)3+3 3+2+1 3+1+1+1 (5)2+2+2 2+2+1+1 2+1+1+1+1

(6)1+1+1+1+1+1
如果左子树K小于右子树P,让P的右子树的的左子树以k倍数分下去。


源代码:
#include
int a[50],sum=0;
void huafen(int m,int n,int ai) 将m分为不大于n的组成数,ai>=0是下标
{
ut<<
去掉注释可以清楚看到递归时的各个变量具体变化情况
int i;
if(0==m) 当m为0是表示得到一个划分,进行输出
{

sum++; 用来累计有多少种,并在最后输出。
for(i=0;i {
cout< if(i cout<<

}
cout< cout< }
for(i=(m0;i--) 总体分解成i种, 每种又有不同的子情况。
{
t<<
ut<<
ut<<
ut<<
a[ai]=i;
t<<
huafen(m-a[ai],a[ai],ai+1); 递归分解,直到得到一个划分
}
}
void main()
{
int n;
cout<<请输入要划分的数:
cin>>n;
huafen(n,n,0);
cout<}运行截图:



古希腊神话与传说-离职申请书


常务-课外阅读的重要性


依葫芦画瓢-十句哄女人开心的话


最经典的单机游戏-建国大业电影观后感


结绳记事的故事-元宵节的英文


开业典礼流程-门面房租赁合同范本


软文技巧-关于祖国的歌


清蒸鲈鱼正宗做法-英语评课记录