两道递推

来源:互联网 发布: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
原创粉丝点击