状态表示:
\(f(i,j)\):\(i\)的\(j\)划分总数。
状态转移:
考虑\(n\)的\(m\)划分\(a_i(\sum_{i = 1}^ma_i=n\)):
- 如果对于每个\(i\)都有\(a_i > 0\),那么\(\{a_i-1\}\)就对应了\(n-m\)的\(m\)划分。
- 如果存在\(a_i=0\),这就对应了\(n\)的\(m-1\)划分。
\[f(i,j) = \begin{cases}
f(i,j-1)+f(i-j,j) & i \ge j
\\
f(i,j-1) & i < j
\end{cases}
\]
如果\(i<j\),那么\(i\)的\(j\)划分必存在\(a_i=0\)。
\[f(0,0 \sim m)=1
const int N = 1010;
int f[N][N];
int n,m;
int main()
{
while(cin >> n >> m)
{
for(int i = 0; i <= m; i++) f[0][i] = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
if(i >= j) f[i][j] = f[i][j - 1] + f[i - j][j];
else f[i][j] = f[i][j-1];
}
cout << f[n][m] << endl;
}
//system("pause");
return 0;
}