思路:
这道题我们可以先设f[i][j]表示把i分为j份的方案数,那么我们考虑它由哪几种状态转移而来
把i-1分成j-1份,然后最好加上一个1可以对它产生贡献
把i-j分成j份,就相当于把j份全部加上1,可以对它产生贡献
那么递推式就是
f
[
i
]
[
j
]
=
f
[
i
]
[
j
]
+
f
[
i
−
1
]
[
j
−
1
]
+
f
[
i
−
j
]
[
j
]
f[i][j]=f[i][j]+f[i-1][j-1]+f[i-j][j]
f[i][j]=f[i][j]+f[i−1][j−1]+f[i−j][j]
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int f[1000][1000], n, k;
int main()
{
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
f[i][1]=1;
for(int i=2; i<=k; i++)
{
f[i][i]=1;
for(int j=i+1; j<=n; j++)
f[j][i]+=f[j-1][i-1]+f[j-i][i];
}
printf("%d", f[n][k]);
return 0;
}