演算法 排列組合

2022-09-06 11:42:26 字數 856 閱讀 2135

a(m,n) = n!/(n-m)!

從 n 個數中取 m 個有前後順序的數列

有 a(m,n) 種方式

c(m,n) = n!/[(n-m)!m!] = a(m,n)/m!

從 n 個數中取 m 個無前後順序的數列

有 c(m,n) 種方式

性質:c(m,n) = c(n-m,n)

c(r,n+1) = c(r-1,n) + c(r,n)

(楊輝三角性質)

c(0,n)+c(2,n)+c(4,n)+... = c(0,n)+c(2,n)+c(4,n)+... = 2^(n-1)

(楊輝三角係數的對半 a=b=1)

o o o o o o o [七個蘋果分到三個有編號的盤子中]

之間一共有6個縫隙

往縫隙中插隔板形成3個不同的區間(就是不同的盤子)

所以為 c(2,6) = 15

有 n1 a

n2 b

n3 c

有 (n1+n2+n3)!/(n1! * n2! * n3!)

a(m,n)/m

有 a b c d e f g 七個不同的蘋果

分到 x y z三個不同的盤子裡

(1,1,5) (1,2,4) (1,3,3) (2,2,3)

(1,1,5): i = c(1,7)c(1,6)c(5,5)/a(2,2)

(1,2,4): j = c(1,7)c(2,6)c(4,4)/a(2,2)

(1,3,3): k = c(1,7)c(3,6)c(3,3)/a(2,2)

(2,2,3): l = c(2,7)c(2,5)c(3,3)/a(2,2)

ans = (i + j + k + l)*a(3,3)

排列組合相關演算法

排列生成演算法 問題 給出數字a1,a2,an,生成所有排列。如果用遞迴,這個演算法執行時的遞迴深度會很大的,而且遞迴如何乙個乙個地返回排列結果呢。下面的演算法的核心思想都是如何根據當前給定的排列p 第乙個排列自然是p a1a2.an了 然後生成唯一的下乙個排列。如此迴圈n 次,自然獲得所有的排列。...

排列組合演算法

在開發的過程中很難免會到排列組合,剛開始通過for迴圈來搞定。但是對於工作了近五年的我而已,不能像 新人那樣做了。如果所要組合的集合大於40,你不可能寫40個for迴圈吧!這裡使用了數學的演算法,到底是啥演算法,高人也沒說!不過我把它的思想提公升了一下。如下 ifndef combination h...

排列組合演算法

1.排列演算法 include define max num 100 void print int n,int num void swap int a,int b int arrange int i,int n,int num i return count int combination int u...