具體我們直接開干!
看一個常見問題,排班,6人,每次需要3人,共有多少種組合?
友情提醒:下面公式第一眼看上去,100%暈,感興趣的可以看下面的詳解,或者保存公式,以后套用
▼公式
=TEXTJOIN('|',,REPT($A$1:$A$5,MID(LET(組合,BASE(ROW($1:$31),2,5),TEXT(SMALL(--IF(LEN(組合)-LEN(SUBSTITUTE(組合,1,))=3,組合,9^9),ROW(A1)),'00000')),ROW($1:$5),1)))
下面我們就來詳細說說這公式及思路!
▍思考01 :M取N個組合有多少個?
這個問題,我們可以通過Excel的函數(shù)來處理,COMBIN(M,N)
本案例中,5取3,所以我們的組合結果為:
得到這個,我們可以驗證結果是符合要求!
▍思考02:組合的原理
所謂組合,也就是從M個中取3個全部組合,那么本質就是取或者不取,這個東西是不是和2進制中1和0一樣,1代表取,0代表不取,如果我們列出所有的取和不取組合,那么這個問題就簡單了
說到這里,我們就不得不說一下BASE函數(shù)
BASE函數(shù):進制轉換,3個參數(shù)
>參數(shù)1:數(shù)值
>參數(shù)2:進制
> 參數(shù)3:長度
比如我們都知道10的二進制是 1010,一般采用 除2反向取余法
第一次:10/2=5余0
第二次:5/2 =2余1
第三次:2/2 =1余0
第四次:1/2 =0余1
進制的問題,我們解決了,下面就是如何列出所有的組合
5個 分別取1個、2個、3個、4個和5個,一共有多少種組合? 學過COMBIN,簡單了!分別再相加即可!合計31
根據(jù)他們的算法,有一個簡單的規(guī)律 就是2^n-1 比如這里的 5個,就是2^5-1=31 ,所以后面我們使用第二種算法處理!
我們把1-31 全部轉成2進制,就可以得到全部的組合情況,正好31組,分別是0和1組成,可以大概看看他們的規(guī)律!
=BASE(ROW(1:31),2,5)
那么我們要的5選3,也就是其中正好于3個1,其他都是0即可!
那我們?nèi)绾握业絻?nèi)容中正好有3個1的部分呢?,替換法,如果把1替換掉的長度和原來的長度差額正好是3,說明滿足條件
那么我們就是把這些都提取出來,按照按照位置去提取即可!0不取,1??!
我們整合一下:
=TEXT(SMALL(--IF(
LEN(BASE(ROW($1:$31),2,5))-LEN(SUBSTITUTE(BASE(ROW($1:$31),2,5),1,))=3,
BASE(ROW($1:$31),2,5),9^9),ROW(A1)
),'00000')
還是有點看不懂是吧??? 公式比較簡單,只是較長吧,我們可以利用LET函數(shù)簡化一下,大家就能很好明白!
說明:把1替換成空,如果原來的內(nèi)容長度-替換后的內(nèi)容長度=3,說明正好有3個1,提取3個內(nèi)容,把這部分使用SMALL逐個提取出來即可!
有了這個,下面就是如何和內(nèi)容關聯(lián)上了!
▍思考03:提取內(nèi)容
1表示提取1,0不取,那么我們就需要把每一位截取出來,然后通過IF判斷即可,或者使用常規(guī)套路REPT處理!
逐位提??!
那么如何對應數(shù)據(jù)源呢?Excel TRUE對應非0,F(xiàn)ASLE對應0,那么正好可以利用1和0對應IF是否滿足條件
=IF(--MID(C1,COLUMN(A:E),1),TRANSPOSE(A1:A5),'')
為了演示直觀,我們截取位多列,其實多行即可!這樣就不用轉置了!同時IF部分我們可以使用REPT函數(shù)代替!,重復0次就是空值,重復1就是本身!
最后使用TEXTJOIN合并起來即可,利用第二參數(shù)忽略控制
=TEXTJOIN('|',,REPT($A$1:$A$5,MID(C1,ROW($1:$5),1)))
那我們把所有部分合并起來一起寫就成了最后的公式!
▼沒有LET函數(shù)的朋友,BASE部分多寫幾次即可!
=TEXTJOIN('|',,REPT($A$1:$A$5,MID(LET(組合,BASE(ROW($1:$31),2,5),TEXT(SMALL(--IF(LEN(組合)-LEN(SUBSTITUTE(組合,1,))=3,組合,9^9),ROW(A1)),'00000')),ROW($1:$5),1)))
根據(jù)上面的思路,其實我們可以總結出一個通用一些的公式:
如果內(nèi)容在A列,取N個在D5
▼通用公式
=IFERROR(TEXTJOIN(',',,REPT(OFFSET($A$1,,,COUNTA($A:$A)),MID(BASE(LARGE(IF(LEN(SUBSTITUTE(BASE(ROW(INDIRECT('1:'&2^COUNTA($A:$A))),2,COUNTA($A:$A)),0,))=D$5,ROW(INDIRECT('1:'&2^COUNTA($A:$A)))),ROW(A1)),2,COUNTA($A:$A)),ROW(INDIRECT('1:'&COUNTA($A:$A))),1))),'')
OK!今天的內(nèi)容就到這里,快速試試吧!
聯(lián)系客服