>Link
ybtoj数的划分
>解题思路
设 f i , j f_{i,j} fi,j为 i i i个数分成 j j j份的合法方案数
当我们枚到 i i i时划分方法有两种:
- 第 i i i个数单独成为大小为1的一份,所以方案数为 f i − 1 , j − 1 f_{i-1,j-1} fi−1,j−1
- 因为求得是组合,不可以重复方案,我们可以从 f i − j , j f_{i-j,j} fi−j,j转移过来,把 i − j i-j i−j个数分成 j j j份,剩下的 j j j个数分别分到这 j j j份中,使每一份大小+1
所以 f i = f i − 1 , j − 1 + f i − j , j f_i=f_{i-1,j-1}+f_{i-j,j} fi=fi−1,j−1+fi−j,j
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, k, f[205][10];
int main()
{
scanf ("%d%d", &n, &k);
f[1][1] = 1;
for (int i = 2; i <= n; i++)
for (int j = 1; j <= min (i, k); j++)
f[i][j] = f[i - 1][j - 1] + f[i - j][j];
printf ("%d", f[n][k]);
return 0;
}