1.球相同,盒相同,允许空箱
2.球相同,盒相同,无空箱
3.球相同,盒不同,无空箱
4.球相同,盒不同,允许空箱
5.球不同,盒相同,无空箱
6.球不同,盒相同,允许空箱
7.球不同,盒不同,无空箱
8.球不同,盒不同,允许空箱
n个球放入m个盒子
一共是上述八种情况,现在具体来思考一下分别应该怎么做
1.球相同,盒相同,允许空箱
n个球,m个盒子,两种选择,一个是把所有箱子都放一个球,这样的话就和 dp[n-m][m]相同了
不这么做,这样就和dp[n][m-1]相同了
因为球和盒子都相同,还允许空的
所以:
①dp[n][m]=dp[n][m-1]+dp[n-m][m], n>=m
②dp[n][m]=dp[n][m-1], n<m
边界dp[k][1]=1,dp[1][k]=1,dp[0][k]=1
2.球相同,盒相同,无空箱
现在有n个球和m个箱子,无空箱的话,先每个箱子放一个球 剩n-m个球,结果就是dp[n-m][m] 了,同上
①dp[n-m][m],dp同第7种情况,n>=m
②0, n<m
3.球相同,盒不同,无空箱
插板法:n个球中间有n-1个间隙,在里面选出m-1个间隙来 就行
①n>=m,C(n-1,m-1);
②n<m,0
4.球相同,盒不同,允许空箱
给每个盒子一个球,即转化成了不允许空箱的情况
C(n+m-1,m-1);
5.球不同,盒相同,无空箱 (第二类斯特林数)
对于第n个球,如果前面的n-1个球已经放在了m个箱子里,那么现在第n个球放在哪个箱子都是可以的,所以m*dp[n-1][m];
如果前n-1个球已经放在了m-1个箱子里,那么现在第n个球必须要新开一个箱子来存放,所以dp[n-1][m-1]
所以:
①dp[n][m]=m*dp[n-1][m]+dp[n-1][m-1],1<=m<n
dp[k][k]=1,k>=0
dp[k][0]=0,k>=1
②0,n<m
6.球不同,盒相同,允许空箱
先把不允许空箱的所有情况都算出来,再把n个球时的所有情况做一个累加
sigma dp[n][i],0<=i<=m;
7.球不同,盒不同,无空箱
dp[n][m]是盒子相同时的情况,如果盒子不同的话,球不同时的情况应该乘上盒子(m)的阶乘
dp[n][m]*m的阶乘
8.球不同,盒不同,允许空箱
这个应该是最好想的一种情况
m的n次方 每一个球都有m中选择;