打表,dp[i][j]表示的是对于数i,最大可分数为j的划分个数。
1:i==j dp[i][j]=1+dp[i][j-1];
2:i<j dp[i][j]=dp[i][i]因为不可能i<j
2:i>j dp[i][j]=dp[i-j][j]+dp[i][j-1]
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
#define maxn 125
int T;
int main()
{
int dp[maxn][maxn];
int i,j;
memset(dp,0,sizeof(dp));
for(i=1;i<maxn;i++){
dp[1][i]=1;
dp[i][1]=1;
}
for(i=2;i<maxn;i++){
for(j=2;j<maxn;j++){
if(i<j) dp[i][j]=dp[i][i];
else if(j==i) dp[i][j]=dp[i][j-1]+1;
else if(j<i) dp[i][j]=dp[i-j][j]+dp[i][j-1];
}
}
while(EOF!=scanf("%d",&T))
{
cout << dp[T][T] << endl;
}
return 0;
}