题目:
思路:
这题是把n分成k份,我们先考虑把i分成j份,先抽出j个1,剩下i-j个1 往这j个1里面塞。
把这i-j个1分成一份,两份... ,最多分成j份,这样动态规划的递推公式就出来了
进而得以求解
代码:
#include<bits/stdc++.h>
using namespace std;
long long f[205][8];
int main()
{
int n,k;
cin>>n>>k;
f[0][0]=1;
for(int i=1;i<=n;i++)
f[i][1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k && j<=i;j++)
{
f[i][j]=f[i-1][j-1]+f[i-j][j];
}
}
cout<<f[n][k];
}
代码要注意几个要点
1. 递推函数前面要是long long , 选用 int 会导致部分测试用例无法通过
2. 二维数组要写在main函数之外,否则会导致部分测试用例无法通过