这是一道简单的组合数学题,这里要用递推来做;
方法一:A[n][m] 表示n个盘子放m个苹果的方法,那么A[n][m] = A[n-1][m] + A[n][m-n];就会等于m个苹果放在n-1个盘子的方法(也就是一个盘子为0)加上我们个盘子放一个再把剩下的放到n个盘子;因为每个盘子中加一个数1不会影响A[n][m-n]中的方案的可行性,也不会影响A的定义。


#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using namespace std; int Apple( int n,int m ) { if( m == 0 || n == 1 ) return 1; if( n > m ) return Apple( m , m ); else return Apple( n - 1, m ) + Apple( n , m - n ); } int main( ) { int T,n,m; while( scanf( "%d",&T )==1 ) { while( T-- ) { scanf( "%d %d",&m,&n ); printf( "%d\n",Apple( n , m ) ); } } //system( "pause" ); return 0; }
方法二:
这种方法比较好理解一点,就是后面的数一定不能小于前面的数:
也就是A[i-1]<=A[i];其实前面的方法是前面的数一定不能小于后面的数;


#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using namespace std; int Apple( int t , int n , int m ) { if( t > m ) return 0; if( n == 1 ) return 1; int tt = m/n,sum=0; for( int i = t ; i <= tt ; i ++ ) sum += Apple( i , n - 1 , m - i ); return sum; } int main( ) { int T,n,m; while( scanf( "%d",&T )==1 ) { while( T-- ) { scanf( "%d %d",&m,&n ); printf( "%d\n",Apple( 0 , n, m ) ); } } //system( "pause" ); return 0; }