// ACM_Easy.cpp : Defines the entry point for the console application. //摆苹果_ACM /* */ //E:/ACM/ACM_Easy/Debug/ACM_Easy.exe ///测试数据 /** 把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 **/ #include "stdafx.h" #include "iostream" #include "stdio.h" #include "stdlib.h" //#include "string.h" //#define INIT_MAX 1000 using namespace std; int Answer(int M,int N); int _tmain(int argc, _TCHAR* argv[]) { int Length; cin>>Length; int M,N,K; while(Length--) { cin>>M>>N; if(1 > M|| N > 10) { fprintf(stderr,"您输入的数据有误!"); exit(EXIT_FAILURE); } K = Answer(M,N); cout<<K<<endl; } system("PAUSE"); return 0; } /* f(m,n)=f(m-n,n)+f(m,n-1)f(m,n)表示将m个苹果放到n个盘中的方法数。 f(m-n,n)表示先拿n个苹果每个盘中放一个,保证每个盘中都有苹果f(m,n-1)表示至少有一个盘中没有苹果。 显然f(m,n)=f(n-m,n)+f(m,n-1); 特殊情况考虑:若n>m,f(m,n)=f(m,m);f(m,0)=0;f(m,1)=1;f(1,m)=1; */ int Answer(int M,int N)//(使用递归来实现或许要好一些) { if(M == 0) { return 1; } else if(M < 0) { return 0; } else if(N == 1) { return 1; } else { return Answer(M - N,N) + Answer(M,N - 1); } /* Answer(M - N,N):先在每个盘子里放一个苹果,然后再把剩余苹果(m-n)放到n个盘子里,也就是说每个盘子里至少有一个 Answer(M,N - 1):把m个苹果放到n-1个盘子里,也就是说至少有一个空 */ } ///有BUG,邮箱dabbysunshine@qq.com联系~!___>(^_^)<