首页 > 代码库 > 一些简单的排列组合问题
一些简单的排列组合问题
例1:传送门
例2:将n个相同的球放到m个不同的袋子里有几种方案?
分析:假设m=3,n=2,我们可以这么放(*代表求,空白区域代表袋子): *| |*,还可以这么放: |**| ,还可以这么放:| |**......这样的话就有m-1个隔板(|)和n个球需要放置在n+m-1个位置中,考虑放置隔板的方案数为C(n+m-1,m-1),考虑求的方案数为C(n+m-1,n),那么答案为C(n+m-1,m-1) = C(n+m-1,n).
例3:将n个不同的球放到m个不同的袋子里有几种方案?
分析:第一个袋子可以放n种球,第二个袋子可以放n-1种球......第m个袋子可以放n-m种球,答案为n*(n-1)*...*(n-m).这样分析有点麻烦,因为每一种球都是不一样的,每一种球都只能放进1个袋子里,而每一种袋子则不一样,可以装下n种球。所以我们对球进行分析:第一个球可以放m个袋子里,第二个球可以放m个袋子里,...,第n个球可以放m个袋子里,答案为m^n.
例4:将n个不同的球放到m个相同的袋子里有几种方案?
分析:袋子相同就没办法用数学公式推导了,考虑dp.令f[i][j]表示前i个球放在j个袋子里的方案数。考虑第i个球怎么放,如果第i个球占用了一个新的袋子,那么f[i][j] += f[i-1][j-1]就好了。如果没有呢?那么这个球就能放到j个袋子里,即f[i][j] += f[i-1][j] * j,合并一下f[i][j] = f[i-1][j-1] + f[i-1][j] * j.答案是f[n][1] + f[n][2] + ...+ f[n][m]
例5:将n个相同的球放到m个相同的袋子里有几种方案?
分析:球相同,袋子也相同,这要怎么计数啊QAQ,要既不多也不少的计数,肯定是有某一种顺序,我们按照每个袋子装球的数量降序排列,这就相当于把相同的袋子强行当成了不同的袋子,为了维护这个降序,我们一旦在第i个袋子放一个球,那么前面的袋子都必须要放一个球,当然,我们也可以考虑不在这个位置多放一个球,我们在后面的袋子放,所以f[i][j] = f[i-j][j] + f[i][j-1].这道题和上一道题有一个很大的区别,上一道题的状态转移方程没有考虑不放的情况,是因为袋子是相同的,放在这个袋子和那个袋子是没有区别的,我们硬性规定第i个球必须放在我们选定的j个袋子中,而这一题虽然题面上说袋子相同,但是我们硬性规定是不同的,所以可以考虑不放的情况。
总结:这四道题可以得出一个规律:袋子不同用数学,袋子相同用dp,不同和相同的区别在于,不同的话我们可以单独考虑第i个,相同的话必须要变成“不同”的才能单独考虑!
一些简单的排列组合问题