ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 19867|回复: 30

[推荐] [推荐]排列组合的解法和解释(gouweicao78)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-6-26 23:56 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:MMULT

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编辑过]

点评

知识树知识补充内容在6楼  发表于 2014-3-15 17:57

TA的精华主题

TA的得分主题

发表于 2008-6-27 08:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
非常感谢版主的详解,学习ing~~

TA的精华主题

TA的得分主题

发表于 2008-6-27 09:37 | 显示全部楼层

有个类似问题,顺便也贴在这里备查。

http://club.excelhome.net/viewthread.php?tid=332173&replyID=&skin=0

很有意思,那个楼主的ID是jk2007,不知道和这里的楼主是什么关系。

TA的精华主题

TA的得分主题

发表于 2008-6-27 09:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请问斑竹,MOD(INT(ROW(Sheet1!$1:$255)/2^{7,6,5,4,3,2,1,0}),2),这个算法是根据什么想出来的?看着好像计算机二进制的感觉,不懂

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-27 09:40 | 显示全部楼层
to 方版:

肯定是同一个人啦,连附件名字都一样的。

to shaowu459:这个算法不是我想出来的,呵呵。是转换二进制的一种解法。我主要的工作是将其余部分作个拆解说明,以便大家知道如果是6选2、10选4等其他排列组合要修改哪一部分,呵呵,就像有人种了瓜,结了果,我告诉大家怎么削皮去籽儿才好吃。

[此贴子已经被作者于2008-6-27 9:46:35编辑过]

TA的精华主题

TA的得分主题

发表于 2008-8-15 23:22 | 显示全部楼层
QUOTE:
以下是引用gouweicao78在2008-6-26 23:56:59的发言:

…………

【解法限制】因为MMULT函数所返回的结果不能超过5641个,这限制了排列组合元素不能超过12个。因为SUM(COMBIN(12,ROW(1:12)))=4095个,SUM(COMBIN(13,ROW(1:13)))=8191个。

不过,备选元素到12个的时候,其运算速度已经不是普通配置的机器能忍受的了。


前段在论坛上回答网友关于组合的问题,自以为问题顺利解决,找到了正确的答案。今日看到gouweicao78大侠关于排序问题的解决方法及思路,才发觉不但自己的解决错了,而且方向也完全错误(尽管之前已发现了错误)。

在经过努力的学习、思考gouweicao78的解法公式,总算弄明白了公式的含义,看到gouweicao78说由于MMULT()函数的限制,不能进行超过8的排列,深感遗憾。冥思苦想,是否有其它方法突破MMULT函数限制,编制出能进行任意组合数的公式来呢?

仔细分析gouweicao78的公式,发现之所以要用MMULT函数,主要是因为参数为数组,就是要利用MMULT函数“汇总”的特点,实现数组操作。那么:能不能变数组操作为单个值的操作呢?因为如果是单个值,就不必用MMULT函数了。思考至此,觉得有希望了。最后,想到了:用增加辅助列,由数组操作变为单个值操作,问题得到解决。

如果计算机速度够快、EXCEL单元格够用,函数允许,照这种方法,可以排出任意个数的组合。试着做出了一个15及以内的任意数组合。详情见附件。

注意:由于运算量大,运行速度慢,建议速度慢的谨慎运行。(文件为2007年版本)

如有错误,望各位坛中高手们不吝赐教!!!!!

文件大,只好分割上传!

UtyYGBZC.rar (203.41 KB, 下载次数: 341)


457qkuuz.rar

200.21 KB, 下载次数: 345

[推荐]排列组合的解法和解释(gouweicao78)

SFUyXuGS.rar

199.08 KB, 下载次数: 312

[推荐]排列组合的解法和解释(gouweicao78)

TA的精华主题

TA的得分主题

发表于 2008-8-16 07:53 | 显示全部楼层

附一图片以助上面的说明。


[推荐]排列组合的解法和解释(gouweicao78)

[推荐]排列组合的解法和解释(gouweicao78)

TA的精华主题

TA的得分主题

发表于 2008-8-16 07:56 | 显示全部楼层

楼主真是及时雨,

最近坛子里很多人都在问排列组合的问题

TA的精华主题

TA的得分主题

发表于 2008-8-16 08:50 | 显示全部楼层
<p><font face="Times New Roman" color="#ff0000" size="5">重新更新了文件,可以较快打开和运行。并根据需要自行向下复制公式。</font></p><p><br/></p>

[ 本帖最后由 fdd 于 2008-12-13 12:24 编辑 ]

TA的精华主题

TA的得分主题

发表于 2008-8-21 09:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-17 02:25 , Processed in 0.043291 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表