整数划分问题

 

问题描述:

将正整数n表示成一系列正整数之和,n=n1+n2+…+nk ,其中n1n2nk 。

划分的个数记为p(n)。

 

分析:

在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记为q(n,m)。

可以建立如下递归关系。

1)q(n,1)=1,n≥1;

2)q(n,m)=q(n,n),m≥n;

3)q(n,n)=1+q(n,n-1);

   由n1=n的划分和n1≤n-1的划分组成。

4)q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; 

   由n1=m的划分和n1≤m-1的划分组成。

由上知:

 整数划分问题_第1张图片

求q(n,m)的递归算法易得!  p(n)即q(n,n)。

 

 

整数划分问题代码(int_partition.cpp):

---------------------------------------------------------------------------

解1:

#include <iostream> using namespace std; int a[100]; void output(int *b) { int i = 0; cout<<b[i]; while(b[++i] != '/0') cout<<'+'<<b[i]; cout<<endl; } void partition(int n,int m) { int i; if(n <= 0){ output(a); return; } for(i = n; i > 0; i--) if(m == 0 || i <= a[m-1]){ a[m] = i; a[m+1] = '/0'; //cout<<"temp:"; output(a); partition(n-i, m+1); } } int main() { int n,i; cout<<"input an integer:"; cin>>n; partition(n, 0); system("pause/n"); return 0; } 

---------------------------------------------------------------------------

解2:

#include <iostream> using namespace std; int a[100]; int m = 0; void output(int *b) { int i = 0; cout<<b[i]; while(b[++i] != '/0') cout<<'+'<<b[i]; cout<<endl; } void partition(int n) { int i; if(n <= 0){ output(a); return; } for(i = n; i > 0; i--) if(m == 0 || i <= a[m-1]){ a[m] = i; a[m+1] = '/0'; // cout<<"temp:"; output(a); m++; partition(n-i); m--; } } int main() { int n,i; cout<<"input an integer:"; cin>>n; partition(n); system("pause/n"); return 0; } 

---------------------------------------------------------------------------

运行结果:

input an integer:6
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
请按任意键继续. . .

----------------------------------------------------------------------------- 

 

你可能感兴趣的:(算法,Integer,System,input,n2,output)