两道递推
来源:互联网 发布:centos yum 升级gcc 编辑:程序博客网 时间:2024/06/08 16:38
NOIp2001 数的划分
题目描述 Description
将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 5
1 5 1
5 1 1
问有多少种不同的分法。
输入描述 Input Description
输入:n,k (6< n<=200,2<=k<=6)
输出描述 Output Description
输出:一个整数,即不同的分法。
样例输入 Sample Input
7 3
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
{四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
i分成j份
递推:f[i][j]=f[i-1][j-1]+f[i-j][j];
for(i=1;i<=n;i++)f[i][1]=1; for(i=2;i<=n;i++) for(j=1;j<=k;j++) if(j<=i) f[i][j] = f[i-1][j-1] + f[i-j][j]; printf("%d\n",f[n][k]);
放苹果
描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
17 3
样例输出
8
递推:f[i][j]=f[i][j-1]+f[i-j][j]
for(int i=1;i<=n;i++) f[i][1] = 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][j] + f[i][j-1];else f[i][j] = f[i][i];
1 0