在組合數學，一個集的元素的組合是一個子集。S 的一個 k 組合是 S 的一個有 k 個元素的子集。若兩個子集的元素完全相同並順序相異，它仍視為同一個組合，這是組合和排列不同之處。 表示方式 從 n 個不同元素中取出 k 個元素的所有不同組合的個數，叫做從 n 個不同元素中取出 k 個元素的組合數，記做：C n k、_n C_k、n C_k、Cn_k（英語）、C_nk（法語、羅馬尼亞語、俄語、漢語（中國）、波蘭語）。 理論與公式 從 n 個元素中取出 k 個元素，k 個元素的組合數量為： Cn_k n choose k frac Pn_kk frac nknk 以六合彩為例。在六合彩中從 49 顆球中取出 6 顆球的組合數量為： C49_6 49 choose 6 frac 49643 13983816 在集合中取出 k 項元素 重複組合理論與公式 從 n 個元素中取出 k 個元素，k 個元素可以重複出現，這組合數量為： H_kn C_n1nk1 以取色球為例，每種顏色的球有無限多顆，從 8 種色球中取出 5 顆球，好比是在 5 顆球間畫上分隔號 代表球色的分佈情形。例如第 1 種色球取 1 顆，第 2 種色球取 2 顆，第 3 種色球取 2 顆可以表示成： 球 球球 球球 可以理解為 8 類球每類取多少個，一起構成 5 個球。我們把 5 個球排成一排，用 7 個分隔線去隔開。如上圖，表示含義：第 1 根線前表示第一類球取的個數，第 1 根和第 2 根線表示第二類球取的個數 第 6 第 7 根線前表示第七類球的個數，第 7 根後表示第八類球的個數。亦即問題是從 581 個位置中挑選出 81 個位置擺分隔號，這組合數量為： H_58 C_81581 C_712 frac 1275 792 因為組合數量公式特性，重複組合轉換成組合有另一種公式為： H_knC_n1nk1frac nk1kn1C_knk1 另外 H_kn 也可以記為 F_kn OCLC44527392 或 left binom nkright F_kn H_kn left binom nkright H_kn 取值範圍的擴充 OCLC44527392 在 C_kn 的定義中，由於它有意義的範圍必須是滿足條件 n ge k ge 1，所以其他範圍必須另外定義，我們有 C_kn begin cases 1 k 0 0 0 leq n k lor k 0 leq n 1k C_kn k 1 n0 land k 0 1n k C_n 1k 1 n0 land k 0 end cases 演算範例 組合 C 迴圈法 This is C code Comb Example include iostream include vector using namespace std bool next_comb vectorint comb const int n const int k int i k 1 const int e n k do comb i while comb i e i i if comb 0 e return false while i k comb i comb i 1 1 return true int main int n k cout comb n k endl cin n k if n k k 0 cout Invalid input n must be k and k must be 0 endl return 0 vectorint comb k for int i 0 i k i comb i i do for int i 0 i k i cout comb i 1 if i k 1 cout cout endl while next_comb comb n k return 0 遞迴法 include iostream include cstdio using namespace std namespace comb int n k int arr 12 int count bool arrsame int site if site 0 arr site 1 arr site return 0 return 1 inline void arrprint for int i 0 i k i printf 3d arr i puts count void calculate int now if now k arrprint return for int i 0 i n i arr now i if arrsame now calculate now 1 inline void run int nn int kk n nn k kk count 0 if k 12 n k k 0 calculate 0 if count printf n d combinationnn count else puts Input error int main int n k while scanf d d n k EOF combrun n k fflush stdout return 0 重複組合 H 迴圈法 This is C code ReComb Example include iostream using namespace std bool next_re_comb int recomb const int n const int k int i k 1 do recomb i while recomb i n 1 i if recomb 0 n 1 return 0 while i k recomb i recomb i 1 return 1 int main int n k cout recomb nk endl cin n k if n 0 k 0 return 0 int recomb new int k for int i 0 i k i recomb i 0 do for int i 0 i k cout i k n cout recomb i 1 while next_re_comb recomb n k delete recomb return 0 遞迴法 include iostream include cstdio using namespace std namespace re_comb int n k int arr 12 int count bool arrsame int site if site 0 arr site 1 arr site return 0 return 1 inline void arrprint for int i 0 i k i printf 3d arr i puts count void calculate int now if now k arrprint return for int i 0 i n i arr now i if arrsame now calculate now 1 inline void run int nn int kk n nn k kk count 0 if k 12 k 0 calculate 0 if count printf n d combinationnn count else puts Input error int main int n k while scanf d d n k EOF re_combrun n k fflush stdout return 0 推廣 組合數可以推廣到多分類的情形 ，我們將 n 個物品分為 m 份，每份的個數分別為 k_1k_2cdots k_m 個，那麼，總的分類數為 binom nk_1k_2cdots k_mfrac nk_1k_2cdots k_m 參見 機率論 組合數學 Category 組合數學 參考文獻 外部連結 組合數公式的直觀理解及其推廣