思路:递归。太妙了!将m个苹果放入n个篮子里,允许有的篮子空着这个事件Z,包含两个互斥事件A和B,即A并B=U,A交B为空集;其中事件A为有的篮子空着,即至少有1个篮子空着;B为所有篮子都不空,即每个篮子都至少有1个苹果。
令(m,n)表示将m个苹果放入n个盘子中的摆放方法总数。
1.假设有一个盘子为空,则(m,n)问题转化为将m个苹果放在n-1个盘子上,即求得(m,n-1)即可
2.假设所有盘子都装有苹果,则每个盘子上至少有一个苹果,即最多剩下m-n个苹果,问题转化为将m-n个苹果放到n个盘子上
即求(m-n,n)
#include <iostream> using namespace std; int apple(int m,int n){ if(m<0||n<0) return 0; else if(m==1||n==1) return 1; else return apple(m,n-1)+apple(m-n,n); } int main() { int m,n; while(cin>>m>>n){ cout<<apple(m,n)<<endl; } return 0; } // 64 位输出请用 printf("%lld")