小球和箱子

/*
将n个不同的球放入m个不同的盒子的方案数
m^n 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[1010],l;
int main()
{
    scanf("%d%d",&n,&m);
    int k=m;
    while(k)
      {
          a[++l]=k%10;
          k=k/10;
      }
    for(int i=2;i<=n;i++)
      {
          for(int j=1;j<=l;j++)a[j]=a[j]*m;
          for(int j=1;j<=l;j++)
            if(a[j]>9)
              {
                a[j+1]+=a[j]/10;
                a[j]=a[j]%10;
            }
        if(a[l+1])l++;
      }
    for(int i=l;i>=1;i--)
      printf("%d",a[i]);
    return 0;
}
/*
将n个相同的球放入m个不同的盒子的方案数
x1+x2+...+xm=n
都加1 x1+x2+...+xm+m=n+m 每个解不为0 
直接隔板法 C(m-1,m+n-1) 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int main()
{
    scanf("%d%d",&n,&m);
    int p=m-1;
    int q=m+n-1;
    int sum=1,div=1;
    for(int i=q;i>=q-p+1;i--)
      sum*=i;
    for(int i=1;i<=p;i++)
      div*=i;
    printf("%d
",sum/div);
    return 0;
}
/*
将n个相同的球放入m个相同的盒子的方案数
f[i][j]=f[i][j-i]+f[i-1][j];
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,m,f[100][100];
int Dfs(int k,int p)
{
    if(k==0||p==1)return 1;
    if(f[k][p])return f[k][p];
    if(p>k)return Dfs(k,k);
    return Dfs(k,p-1)+Dfs(k-p,p);
}
int main()
{
    scanf("%d",&T);
    while(T--)
      {
          memset(f,0,sizeof(f));
          scanf("%d%d",&n,&m);
        printf("%d
",Dfs(n,m));
      }
    return 0;
}
/*
将n个不同的球放入m个相同箱子里的方案数 
F[i][j]=f[i-1][j-1]+f[i-1][j]*j;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,f[100][100];
int main()
{
    scanf("%d%d",&n,&m);
    f[0][0]=1;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=i&&j<=m;j++)
        f[i][j]=f[i-1][j-1]+f[i-1][j]*j;
    printf("%d
",f[n][m]);
    return 0;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/5514934.html