又一经典问题,noip2001。
用到了分类的思想。对于f[i][j]代表i分为j份。我们分为以下两类:
- 每份都没有1:那么我们只需要将每份都减1然后保证有j份。即加上f[i-j][j]。
- 至少有一份1:那么我们提出1个1,即加上f[i-1][j-1]。
1: #include <stdio.h>
2: #define maxn 300
3:
4: int f[maxn][maxn];
5: int n,m;
6:
7: int main()
8: {
9: scanf("%d%d",&n,&m);
10: f[0][0]=1;
11: for (int i=1;i<=n;++i)
12: for (int j=1;j<=m;++j)
13: if (i-j>=0)
14: f[i][j]=f[i-j][j]+f[i-1][j-1];
15: printf("%d\n",f[n][m]);
16: return 0;
17: }
18: