将n个完全相同的小球随机的放入N个盒子中,一共有多少中放法?请给出完全的推导过程@
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将n个完全相同的小球随机的放入N个盒子中,一共有多少中放法?请给出完全的推导过程@相关的知识,希望对你有一定的参考价值。
注意一点就是每个小球都一样@盒子不一样,不是每个盒子都一定要有球!球是随机的放进去的@
如果不要求每个盒子都有球的话,从小球的角度看,每一个小球都可以放在N个盒子中的一个,故有N种放的可能,故一共有 N^n (N的n次方)种放法。 参考技术A 应该是N的n次方除以n的阶乘 参考技术B n!种,也就是n*(n-1)*(n-2)......盒子与小球之二
- 描述
-
N个有差别的盒子(1<=N<=20)。你有A个红球和B个蓝球。0 <= A <= 15, 0 <= B <= 15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
- 输入
-
就一行,N,A,B,用空格分开
- 输出
-
就一行,输出放置方案总数
- 样例输入
-
2 1 1
- 样例输出
-
9
查看
思路在代码注释中,很明显要用到分类,另外就是要用 long long
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<cstring> #define DEBUG(x) cout << #x << " = " << x << endl typedef long long ll; using namespace std; int N,A,B; ll ways[25][20][20]; ///将a个红球和b个蓝球放入前i个盒子中的放法 ll Ways(int i,int a,int b) { ll t=ways[i][a][b]; if(t!=-1)return t; if(i==0)return 1; if(a==0&&b==0)return 1; ll r; ///不放 r=Ways(i-1,a,b); ///放一种 for(int k=1;k<=a;k++){ r+=Ways(i-1,a-k,b); } for(int k=1;k<=b;k++){ r+=Ways(i-1,a,b-k); } ///放两种 for(int p=1;p<=a;p++){ for(int q=1;q<=b;q++){ r+=Ways(i-1,a-p,b-q); } } // DEBUG(r); ways[i][a][b]=r; return r; } int main() { // freopen("in.txt","r",stdin); memset(ways,0xff,sizeof(ways)); scanf("%d %d %d",&N,&A,&B); printf("%lld ",Ways(N,A,B)); return 0; }
以上是关于将n个完全相同的小球随机的放入N个盒子中,一共有多少中放法?请给出完全的推导过程@的主要内容,如果未能解决你的问题,请参考以下文章
将7个不同的小球放入4个不同盒子中,每个盒子都不空,则不同的方法中种数有
随机产生N个1,1000之间不重复的整数存入数组A中,并按从大到小顺序排列。键入整数X,查找:若无,则插入,
有3个小球和两只杯子,将小球随机放入杯中,设X为有小球的杯子数,求X的概率分布?