问题描述:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问 共有多少种不同的分法?
5,1,1和1,5,1 是同一种分法。
作者:何知令
完成时间:2017年5月7日
输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=20。
输出:对输入的每组数据M和N,用一行输出相应的K。
解题思路:解题思路:我们不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法,下面对不同的情况给予讨论:
(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。
(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。
当m=n时,f(m-n,n)中m-n成了0,即是先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,但m=n,故只有一种算法;
(3):当m
(4):当m>=n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果,这样子就相当于f(m,n-1),第二种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n);
综上所述:
得到递归表达式:
f(m,n)=1 当 m=1或n=1;
f(m,n)=f(m,m) 当m
f(m,n)=f(m-n,n)+f(m,n-1) 当m>=n;
5,1,1和1,5,1 是同一种分法。
作者:何知令
完成时间:2017年5月7日
输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=20。
输出:对输入的每组数据M和N,用一行输出相应的K。
解题思路:解题思路:我们不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法,下面对不同的情况给予讨论:
(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。
(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。
当m=n时,f(m-n,n)中m-n成了0,即是先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,但m=n,故只有一种算法;
(3):当m
(4):当m>=n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果,这样子就相当于f(m,n-1),第二种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n);
综上所述:
得到递归表达式:
f(m,n)=1 当 m=1或n=1;
f(m,n)=f(m,m) 当m
f(m,n)=f(m-n,n)+f(m,n-1) 当m>=n;
***********************************************************************************************
代码:
/*
问题描述:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问 共有多少种不同的分法?
5,1,1和1,5,1 是同一种分法。
作者:何知令
完成时间:2017年5月7日
输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=20。
输出:对输入的每组数据M和N,用一行输出相应的K。
解题思路:解题思路:我们不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法,下面对不同的情况给予讨论:
(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。
(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。
当m=n时,f(m-n,n)中m-n成了0,即是先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,但m=n,故只有一种算法;
(3):当m
(4):当m>=n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果,这样子就相当于f(m,n-1),第二种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n);
综上所述:
得到递归表达式:
f(m,n)=1 当 m=1或n=1;
f(m,n)=f(m,m) 当m
f(m,n)=f(m-n,n)+f(m,n-1) 当m>=n;
***********************************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
int f(int, int);
int main()
{
int t, m, n, sum;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &m, &n);
sum = f(m, n);
printf("%d\n", sum);
}
return 0;
}
int f(int m, int n)//递归时不要想基本运算式是什么,只要把所有的情况全考虑到即可(最重要的是最根本的几个值)
{
if (m<n)
return f(m,m);
if (n==1||m==1||m==0)
return 1;
return f(m-n,n)+f(m,n-1);
}
程序运行结果展示:
知识点总结:递归
学习心得:不是我写的,但一直在试图理解