整数划分问题是算法中的一个经典命题之一。把一个正整数n表示成一系列正整数之和:
n = n1 + n2 + ~ + nk 其中,n1>=n2>=~>=nk>=1 ,k>=1
正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作 P(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
分析:
- 当n=1时,无论m为什么值,只有一种划分。F(1,m) = 1, m>=1.
- 当m=1时,无论n的值为什么,只有一种划分。F(n,1) = 1, n>=1。
- 当m>=n时,最大加数实际上不能超过n。F(n,m)=F(n,n)。
- 当n=m时,F(n,n) = 1 + F(n,n-1)。
- 当n>m时,F(n,m) = F(n,m-1) + F(n-m,m)。
代码
#include <iostream>
using namespace std;
int f(int n,int k)
{
if(n==1||k==1)
return 1;
if(n<=k)
return 1+f(n,n-1);
if(n>k)
return f(n,k-1)+f(n-k,k);
return 0;
}
int main()
{
int n;
cin>>n;
cout<<f(n,n)<<endl;
return 0;
}