***********************************************************************************************
代码:
/* 问题描述:把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); } 程序运行结果展示:知识点总结:递归
学习心得:不是我写的,但一直在试图理解