您的位置:首页 > 其它

小球和箱子

2016-05-21 16:05 274 查看
/*
将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\n",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\n",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\n",f
[m]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: