- 总时间限制:
- 1000ms 内存限制:
- 65536kB
- 描述
- 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 输入
- 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 输出
- 对输入的每组数据M和N,用一行输出相应的K。 样例输入
-
1 7 3
样例输出 -
8
来源
lwx@POJ
刚刚学C++就遇到这些问题。。代码是抄的
PlaceApple(m,n)表示把m个苹果放在n个盘子的分法。
PlaceApple(m,n) = PlaceApple(m-n,n)表示先把m-n个苹果放好。然后每一个盘子放一个苹果 + PlaceApple(m,n-1)表示留一个盘子为空。(这两种情况刚好构成 m个苹果n个盘子的总集。)
边界 当只有 1 个苹果或只有 1 个盘子的时候只有一种分法。
#include <iostream>
using namespace std;int PlaceApple(int m, int n)
{if(m < 0)return 0;if(m == 0) return 1;if(n == 1) return 1;return PlaceApple(m - n, n) + PlaceApple(m, n - 1);
}int main()
{int num,m,n;cin>>num;while (num>0){cin>>m>>n;cout<<PlaceApple(m,n)<<endl;num--;}
}