Placing apples
Description
We are going to place M same apples into N same plates.
There could be some empty plates.
How many methods do we have?
When we have 7 applesand 3 plates, the methods, (1, 5, 1) and (5, 1, 1) are the same.
Input
The first line is the number of test cases, t. 0<=t<=20
The next t lines are test cases containing two numbers, M and N. 1<=M, N<=10.
Output
Output the numbers of method in each test case in one line.
Sample Input
1
7 3
Sample Output
8
都不好意思说自己上过组合数学了,而且上个学期刚上过,结果现在只是书中的一个简单模型都解不出来了,OTL,上次在电梯遇见jxp还夸我组合数学考得好,ORZ,考完之后整本书的东西全忘了
【题目大意】给定m个无区别的苹果和n个无区别的盘子,允许盘子为空,求问有几种放置的方法
【解法】m个无区别的苹果和n个无区别的盘子,允许盘子为空。对应的球盒模型是n个无区别小球,m个无区别盒子,允许盒子为空的情况。跟整数拆分的解法是一样的。
由于已经忘记了整数拆分的求法,而且推了半天也没推出来,所以就搜了整数拆分的相关资料,碰见了一篇觉得写得蛮不错的博客,OTL,至少在看完博主的推导之后,我再自己写,总算了写出了正确的算法,不过不知道这次会记住多久。ORZ
http://blog.youkuaiyun.com/pi9nc/article/details/8142091
【AC代码】:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int split(int m, int n){
if(m == 1 || n == 1){
return 1;
}
if(n > m){
return split(m,m);
}
if(n == m){
return 1 + split(m, n - 1);
}
if(n < m){
return split(m - n, n) + split(m, n - 1);
}
}
int main(){
int t, m, n;
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
printf("%d\n", split(m, n));
}
return 0;
}