作者hwangshan (尿布超人)
看板Office
标题Re: [算表] EXCEL的数字排列组合
时间Thu Sep 20 21:23:30 2018
※ 引述《hwangshan (尿布超人)》之铭言:
: 软体:Excel
: 版本:2010
: 问题:
: 已知手上有5个数字,分别为1、3、3、9、0,
: 要列出这5个数字的所有排列方式,
: 例如3、1、3、9、0
: 格式如下图
: https://i.imgur.com/AEBqzSa.png
: 小弟刚接触excel,还请不吝指教。
老实说,我没想到答案这麽困难且复杂~
所以我重新发问好了,正才是我真正要问的问题,也许就不需要那麽复杂的计算式~
以数学来表达我的问题的话,就是
A1+A2+A3+A4=16 且 B1+B2+B3+B4+B5+B6=5 ,求A1~A4、B1~B6之所有非负整数解
而应用上,总合值16和总合值5,是由使用者输入的变数。
非负整数解的个数很简单,就是H(4,16)乘上H(6,5)
基於此,首先我先思考该怎麽列出所有A1+A2+A3+A4=16的所有非负整数解
翻翻小时候的课本,得知可以等效成这样规律的方式来找出所有解
11111+1+1111+111111=(5,1,4,6)
+111111+11+11111111=(0,6,2,8)
以此类推
就是把问题变成排列16个"1"和3个"+",之後就能转换成我要的所有非负整数解了
基於这个逻辑,我昨天才会问那个问题,因为只要有排列函式就能解决了
但是昨天板上大大提供的运算式太难了,我完全不知道该从何修改
所以我在想,也许我是绕了远路了,这样把整个问题丢出来也许能得到比较简单的算法
毕竟实际上,排列的元素只有"1"和"+"这2个
最後,我再次把问题重提一次
以数学来表达我的问题的话,就是
A1+A2+A3+A4=16 且 B1+B2+B3+B4+B5+B6=5 ,求A1~A4、B1~B6之所有非负整数解
而应用上,总合值16和总合值5,是由使用者输入的变数。
https://i.imgur.com/cLnNBJq.png
PS.其实个人觉得也许VBA会比较容易解决问题,目前小弟正在往VBA研究中
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.134.1.81
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1537449813.A.859.html
1F:→ newacc: 从排列组合变成规划求解了XDD 09/20 22:45
解法还是排列啦~
就排列16个"1"和3个"+"的转换结果,然後每个结果重复H(6,5)次,每个结果的右手边排列
5个"1"和5个"+"的转换结果
我觉得应该是这样解的,然而我卡在排列部分,所以先前才问排列的算法
※ 编辑: hwangshan (220.134.1.81), 09/20/2018 23:18:50
2F:推 newacc: 如果要用VBA的话我会选择For Loop硬爆 09/20 23:35
4F:→ newacc: 用VBA反而不需要太钻研排列组合的逻辑,就是一个乖乖穷举 09/21 00:09
5F:→ newacc: 的概念XD 09/21 00:10
6F:→ newacc: 16,5大约有24万笔资料,我电脑测50微秒跑完全部资料,然後 09/21 00:16
7F:→ newacc: 花2秒半写进格子里XD 09/21 00:16
8F:→ newacc: A4赋值那行应该移到For A3回圈里才对,不需要算那麽多次 09/21 00:20
9F:→ newacc: 但不管怎样瓶颈就是写进硬碟的速度 09/21 00:21
写好快~ 我回家再来看看你写的,谢谢你
※ 编辑: hwangshan (220.134.1.81), 09/21/2018 12:59:05
喔喔!关键逻辑真好懂
※ 编辑: hwangshan (220.134.1.81), 09/21/2018 18:43:28
请问,
1.你的choose,那是排列组合中的C取样吧? 既然你是自己写的,
代表VBA中没有该函式罗?
2.你的第一行
Range("D1").Resize(1, 11).EntireColumn.Delete
由於每次计算前都会先清空,导致没办法引用这边计算出来的数字
请问除了将这行隐藏起来之外,有别的办法吗?
※ 编辑: hwangshan (220.134.1.81), 09/22/2018 02:48:30
10F:推 newacc: 1.对,不过後来想想不要叫choose比较好,excel里已经有同 09/22 12:54
11F:→ newacc: 名的函式了。至於excel有没有排列组合的公式,老实说我没 09/22 12:54
12F:→ newacc: 有认真找XD 09/22 12:54
13F:→ newacc: 2.清掉是为了放接下来跑出来的结果,你也可以把这行删掉, 09/22 12:57
14F:→ newacc: 然後把新的资料放到更右边的栏位里,就可以留之前的结果了 09/22 12:57
15F:→ newacc: 或应该也可以把删除改成插入,这样後面的位置也不用调整 09/22 13:00