题目:把M个相同的苹果放到N个同样的盘子里,允许有盘子不放,问一共有多少种放法。
注(5,1,1)和(1,5,1)是同一种放法。
输入:
第一行是测试数据的数目t(0<=t<=20)。以下每行包含一个正整数,分别是M,N。用空格分开
输出:
对于每组数据,输出一个整数K
解析:
设函数f(i,k),i代表苹果的数量,k代表盘子的数量
1.当M<=N时,苹果的数量小于盘子的数量,苹果最多放到M个盘子里,所以f(M,N)=f(M,M)
2.当M>N时。假设有那么一个特殊的盘子,我的苹果要么放到所有盘子里,要么不放到那个盘子里。
所以一共的放法有f(M,N)=f(M,N-1)+f(M-N,N);
这样就可以通过递归不断缩小问题的规模,当函数调用一个函数时,下一个函数就会再考虑有没有这么一个盘子,放或者不放。
所以问题就会被分为有盘子为空和盘子不为空这两种情况。
最后只要考虑一下边界条件就好了,那就是当盘子的数量为1的时候只有一种放法。
这个问题当数据规模比较大的话,就会超时,要用动态规划来排除重复的解。
但是这里数据规模比较小,所以先用递归。
#include <iostream>
using namespace std;
int f(int i,int k);
int main(){
int t,i,k;
cin >> t;
while(t--){
cin >> i >> k;
cout << f(i,k) << endl;
}
return 0;
}
int f(int i,int k){
if(k == 1) return 1;
if(i < k) return f(i,i);
if(i > k) return f(i,k-1)+f(i-k,k);
if(i == k) return f(i,k-1)+1;
}