1. 程式人生 > >淺談"n個球"和"m個盒子"之間的亂倫關係

淺談"n個球"和"m個盒子"之間的亂倫關係

無視標題,從我做起

update in 2018.10.1:

補充了"至多為1的四中情況"

這玩意兒的官方名字應該是叫"Twelvefold way",共用12種情況。

球異,盒同

不空

該情況為經典的第二類斯特靈數

\(f[n][m]\)表示答案。

\(f[n][m] = f[n - 1][m - 1] + m \times f[n - 1][m]\)

邊界條件:\(f[0][0] = 1\)

答案 = 第\(n\)個數單獨佔一個盒子 + 第\(n\)個數和之前的數共佔一個盒子,同時考慮不同位置的貢獻

注意最後要乘\(m\),因為第\(n\)個數放置的位置對答案是有影響的

例如{1}{2 4}{3}與{1}{2}{3 4}是不同的方案

可空

直接列舉用了多少個盒子

\(g[n][m]\)表示答案

\(g[n][m] = \sum_{i = 0}^m g[n][i]\)

至多放\(1\)

此類"至多放\(1\)"的問題若\(n>m\)則方案數一定為\(0\)

答案為\([n <= m]\)

球異,盒異

可空

每一個球都有\(m\)种放法,故答案為\(m^n\)

不空

\(g[n][m]\)表示答案,\(s[n][m]\)為第二類斯特靈數

\(g[n][m] = s[n][m] \times m!\)

相當於是考慮\(m\)個盒子的順序

至多放\(1\)

\(ans = m!(m-1)! \dots (m - n + 1) ! = \frac{m!}{(m-n)!}\)

球同,盒異

不空

插板法的經典例題

\(n\)個球之間形成\(n - 1\)個空位,把\(m\)個盒子塞到裡面

方案為\(C_{n - 1}^{m - 1}\)

可空

注意這裡不能直接套用“插板法”得到\(C_{n+1}^{m - 1}\)

因為使用插板法的前提條件之一就是“分成的方案不能為空”

考慮先在每個盒子中放一個小球,那麼剩下的小球再往裡放的時候就可以無視“非空的條件了”

故方案為\(C_{n+m-1}^{m - 1}\)

這裡再補充一下為什麼不能直接套用插板法

比如\(n = 2, m = 3\)時,方案為\(6\),而直接套用插板法得到的答案為\(3\)

究其原因,是因為沒有考慮到兩個板同時佔了一個空位的情況。

至多放\(1\)

考慮每個球放在了哪裡。

\(ans = C_m^n\)

球同,盒同

可空

這種情況下,不同方案之間與具體用了哪個球以及放到了哪個盒子裡都沒有必然的聯絡

區分不同方案的方法是:把每個盒子的球的個數從小到大排序,比較最終的情況是否相同

例如:\(1 \ 7 \ 1\)\(1 \ 1 \ 7 \\)實際是一種方案

對於\(n = 8, m = 3\)而言一共有\(10\)種不同的放法

0 0 8
0 1 7
0 2 6
0 3 5
1 1 6
1 2 5
1 3 4
2 3 4
3 3 3

從上面的分析我們也不難得出結論

\(n\)個相同的小球放到\(m\)個相同的盒子裡,盒子可以為空的方案數 與一個整數\(n\)拆成\(m\)段非遞減序列的方案數相同

\(f[n][m]\)表示\(n\)個小球放到\(m\)個相同的盒子裡,盒子可以為空的方案數

邊界條件為\(f[0][k] = 1, f[1][k] = 1, f[k][1] = 1\)

遞推方程\(f[n][m] = \begin{cases} f[n - m][m] + f[n][m - 1] &n >= m \\ f[n][m - 1] &n < m \end{cases}\)

解釋一下:

我們考慮這\(m\)個位置中是否有空盒子

顯然:答案 = \(m\)個位置中至少有\(1\)個位置為空的方案 + \(m\)個位置中全不為空的方案

不空

我們可以先在所有盒子裡都放了一個,然後對剩下的球討論

同樣可以得到一個結論:

\(n\)個相同的球,放到\(m\)個相同的盒子裡,盒子不能為空的方案數 與把整數\(n\)拆成\(m\)段,每段不能為\(0\)的方案數相同

\(g[n][m]\)表示\(n\)個小球放到\(m\)個相同的盒子裡,盒子不能為空的方案數

\(g[n][m] = f[n - m][m]\)

題目連結

至多放\(1\)

\(ans = [n <= m]\)

參考資料

相關推薦

"n""m盒子"之間關係

無視標題,從我做起 update in 2018.10.1: 補充了"至多為1的四中情況" 這玩意兒的官方名字應該是叫"Twelvefold way",共用12種情況。 球異,盒同 不空 該情況為經典的第二類斯特靈數 設\(f[n][m]\)表示答案。 \(f[n][m] = f[n - 1][m - 1]

【leetcode筆記】:namb的排列

求排列的個數:https://blog.csdn.net/u013628862/article/details/44261053 題目: 計算3個A,2個B可以組成多少種排列的問題(如:AAABB, AABBA)是《組合數學》的研究領域。但有些情況下,也可以利用計算機計算速度快的

namb的排列

n個a和m個b有幾種排列方法可以用公式直接算即:(n+m)!/(n!*m!); 也可以理解為每次都是n-1個a和m個b排列以後把一個a放進去+把m-1個b和n個a排列後把一個b放進去,可用遞迴實現: #include<stdio.h> int f(int x,i

struts2標籤中的2很常用的標籤的用法(radioselect)

1.如圖所示我們需要在前臺的頁面通過radio和select將對應的資料庫中的資料顯示到選項當中,這也是我們做專案中經常需要做的,動態的顯示,而不是靜態的顯示。    首先我們需要在頁面中匯入str

[遞迴] 組合 | 從n當中任選m | 在一個字串中任選m的全部可能 -C語言

組合 【問題】從長度為n個字串str中選出m個元素的可能 //遞迴求組合數 void combination(char *str, int n, int m ) { if( n < m |

使用者體驗背後的8使用者本能

“我從不去花大金錢去做市場需求論證,就像人們每天都要喝水,所以賣水的肯定有市場。這是人的本能。”一個普通商人的這句話給我帶來下面的思考: “使用者體驗背後有沒有被人們所忽視的使用者本能?” 首先來看使用者體驗一詞最早出自什麼背景的人。 “使用者體驗”這個詞出現在上世紀90年代,被一個叫做唐納德·諾曼

幕後英雄的用武之地——Java內部類的四應用場景

                                                                    幕後英雄的用武之地                                                         ——淺談

求找出N格子中前m的最多人走過的格子??

題目: 對於一個區域中N個地理格子,給定很多人走過的軌跡,求找出N個格子中前m個最多人走過的格子?? 實現: package grid.geo; import java.util.ArrayList; import java.util.Comparator; import java

排列組合問題:n個數中取m(Golang實現)

(一)組合問題 組合是一個基本的數學問題,本程式的目標是輸出從n個元素中取m個的所有組合。 例如從[1,2,3]中取出2個數,一共有3中組合:[1,2],[1,3],[2,3]。(組合不考慮順序,即[1,2]和[2,1]屬同一個組合) 本程式的思路(來自網

軟硬程度一樣的雞蛋,它們在某一層摔下會碎,有100層的建築,要求最多用兩雞蛋確 定雞蛋安全下落的臨界位置,給出臨界位置?如果是n層樓,m雞蛋,請給出確定臨界位置的演算法

題目:問題:一幢大樓共計100層,某種型別的雞蛋從某一樓層及其以上樓層摔下來時會被打破,從該層樓(即臨界樓層)以下樓層摔下該雞蛋,雞蛋不會出現破損。現給你2個完全一樣的該種類型的雞蛋,問:如何通過這2個雞蛋找到該臨界樓層時,所用的摔雞蛋次數最少? 思考:給了我們2個雞

一道演算法題:121圍成一個圓

問題: 桌上有12個黑球和1個白球圍成一個圓,按順時針方向順序數到13就拿走對應的一個球, 如果要求最後拿走的是白球,請問該從哪個球開始數數。 分析: 從最後一輪開始考慮,按輪次倒推。可以用遞迴法

web應用成長的三階段

<?php /** * 前言 * 在開始之前首先要明確的是這裡所說的都是基於MVC模式的php應用,但是又不完全是MVC,因為這裡還有一個業務層。關於MVC * 每個人都有自己的看法,有的是將業務寫在控制器層(肥控制器瘦model),有的是寫在model

企業應用整合的三層次

      企業搞整合的目的並不是簡單追求管理手段和工具的先進性,而是出於管理的目標。比如通過“鋼性”的資訊系統將管理模式輸出到多個同類型的製造或者經營部門,做到作業標準化、工作模式化,實現管理的簡單複製。       其實,我們所用的不同系統都是用來解決管理的某些層面的,或者說處理某些層面的問題比較專業。比

n元素,m組合,可重複

3個元素,11個組合 蘋果,梨子,桃子,選11個的組合 c(n+m-1,m-1)=c(n+m-1,n) #define _CRT_SECURE_NO_WARNINGS #include<st

(Relax DP1.4)UVA 10648 Chocolate Box(求將n巧克力放在m盒子中的概率)

/* * UVA_10648.cpp * * Created on: 2013年12月17日 * Author: Administrator */ #include <i

軟體測試工程師的兩意識,六

一.對工作的持續興趣和熱情: 作為一名優秀的測試工程師,首先要對測試工作有興趣: 測試工作很多時候都是顯得有些枯燥的,因此熱愛測試工作和測試技術,才更容易做好測試工作 二.專業的技能和行業知識: 專業的技能和行業知識,能夠支援測試工程師發展的有力保障。 有了興趣、熱情和專業的技術,我們就能

影響專案成敗的幾方面

          首先,要記住的一句話就是:范進本質風資。          範:即範圍、進:即進度、本:即成本、質:即質量、風:即風險、資:即資源      範圍: 範圍影響著專案的工作量,範圍的

【codeforces 691 D】【並查集 或者 dfs】aps in Permutation【給一個1到N的排列,M操作,每次可以交換X Y位置上的數字,求可以得到的最大字典序的數列】

題意: 給一個1到N的排列,M個操作(1<=N,M<=106),每個操作可以交換X Y位置上的數字,求可以得到的最大字典序的數列。 思路: 把位置分成若干塊,每一塊裡面的位置都是可以被

一個時間插件是如何做到前幾幾月的設置

我們 minute -1 mat code 搬運工 urn repl begin 一如既往的,我們只是代碼的搬運工,代碼搬運工,搬的多了自然也就會了。 代碼: //首先在date原型上擴展一個自定義時間解析方法 Date.prototype.Format_ = funct

hibernate的sessionFactorysession

ber 讀取配置 簡單 開啟 mil fig 理解 name () 首先,講一個悲傷的故事。。。 有一天,一個以為自己javaEE很叼的程序員,在經歷了好久不寫Java代碼的情況下,去參加阿裏巴巴的java面試,然後,在被問到一個很簡單的問題的時候,結果沒有回答好。那麽接下