OUC——1581(组合数学)

来源:互联网 发布:黄金海岸打车软件 编辑:程序博客网 时间:2024/05/20 04:28

题目地址:http://121.249.217.158/JudgeOnline/problem.php?id=1581 

题意:M个相同的球放到N个相同的盒子,有多少种方法,(可以有空盒)。

{

递推公式:

a[m][n]=a[m][n-1]+a[m-n][n];(注意点:a[m][1]=1; a[m][2]=m/2+1;

以及if(m==n)  a[m][n]=a[m][n-1]+1; 

以及if(i<j) a[i][j]=a[i][i];

解释:(1)有空盒的情况:就是a[m][n-1]

2)没有空盒的情况:可以先拿出n个球放到N个盒子里,然后其他的任意放,则有a[m-n][n]个方法。

}

源代码:

#include<iostream>

using namespace std;

int a[3001][3001];

int main()

{

int n;

int m;

int i,j;

a[1][1]=1;

a[0][0]=1;

int num2;

for(i=1;i<3001;i++)

 {

 a[i][1]=1;

 a[i][2]=i/2+1;

 }

     int num;

    for(i=1;i<=3000;i++)

     for(j=3;j<=3000;j++)     

  {

   if(i<j) a[i][j]=a[i][i];

   else if(i==j) a[i][j]=a[i][j-1]+1; 

    else if(i>j) 

{

num=a[i][j-1]+a[i-j][j];

if(num>=1000000007) num=num%1000000007;

    a[i][j]=num;

}

  }

      while(cin>>m>>n)

      {

       cout<<a[n][m]<<endl;

      }

       return 0;