8个以内的排列组合方式:
kYIh0CAl.rar
(14.72 KB, 下载次数: 1677)
可完成8选1、2、3、4……7、8等情况下的排列组合方式。 注意:1、COMBIN(8,1)=8……COMBIN(8,4)=70……最大的组合数是70,也就是说公式最多只需要70行。 2、COMBIN(8,1)+COMBIN(8,2)……+COMBIN(8,8)=255,本解法采用枚举法,把这255种组合情况都列举出来再判定是否满足个数要求。 【公式解释】 【定义名称】mmult1=MMULT(MOD(INT(ROW(Sheet1!$1:$255)/2^{7,6,5,4,3,2,1,0}),2),10^{7;6;5;4;3;2;1;0}) 将8选1、8选2……8选8的共255种排列组合方式都在内存数组mmult1列出。 公式中,Row($1:$255)的255这个数字根据所有组合数之和决定。 2^{7,6,5,4,3,2,1,0}根据备选组合的元素个数决定,例子中是8个。如果是6个备选元素,则为2^{5,4,3,2,1,0}。 【定义名称】text=TEXT(SMALL(IF(MMULT(N(MID(TEXT(mmult1,"00000000"),{1,2,3,4,5,6,7,8},1)="1"),{1;1;1;1;1;1;1;1})=Sheet1!$J$2,mmult1),ROW(Sheet1!1:1)),"00000000") 也就是将mmult1用8位数来表示,比如00000011,00000101等,有2个1表示由8选2,有3个1则表示8选3…… 由此取出1个数与J2单元格输入的个数相同的所有组合,并以8位数表示。 【公式】=IF(COLUMN(A:A)>$J$2,"",IF(ROW(1:1)>COMBIN(8,$J$2),"",INDEX($A$2:$H$2,SMALL(IF(-MID(text,{1,2,3,4,5,6,7,8},1),{1,2,3,4,5,6,7,8}),COLUMN(A:A))))) 表示,列超过J2的个数、行超过组合数,都返回空文本,否则根据text来返回排列组合。 比如: 00010011——这是一个8选3的组合方式,表示由第4、7、8个元素组成。 00000011——这是一个8选2的组合方式,表示由第7、8个元素组成。 【解法限制】因为MMULT函数所返回的结果不能超过5641个,这限制了排列组合元素不能超过12个。因为SUM(COMBIN(12,ROW(1:12)))=4095个,SUM(COMBIN(13,ROW(1:13)))=8191个。 不过,备选元素到12个的时候,其运算速度已经不是普通配置的机器能忍受的了。
[此贴子已经被作者于2008-6-27 1:08:06编辑过] |