2-5 整数划分问题
1)递归法
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
inline int q(int n,int m) //q(n,m):最大加数n1不大于m的划分个数
{
if(n<1 || m<1) return 0;
if(n==1 || m==1) return 1;
if(n<m) return q(n,n);
if(n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
int main()
{
int n;
while(cin>>n){
cout<<q(n,n)<<endl;
}
return 0;
}
2)递归打表法:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=125;
__int64 f[NM][NM];
inline int q(int n,int m) //q(n,m):最大加数n1不大于m的划分个数
{
if(n<1 || m<1) return 0;
if(f[n][m]) return f[n][m];
if(n==1 || m==1) return f[n][1]=f[1][m]=1;
if(n<m) return f[n][n]=q(n,n);
if(n==m) return f[n][m]=q(n,m-1)+1;
f[n][m-1]=q(n,m-1);f[n-m][m]=q(n-m,m);
return f[n][m-1]+f[n-m][m];
}
int main()
{
int n;
while(cin>>n){
memset(f,0,sizeof(f));
cout<<q(n,n)<<endl;
}
return 0;
}