poj 1664 放苹果

这是一道简单的组合数学题,这里要用递推来做;

方法一: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的定义。

View Code
#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];其实前面的方法是前面的数一定不能小于后面的数;

View Code
#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;

}

 

 

 

你可能感兴趣的:(poj)