状态表示:
(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) = egin{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;
}