ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 找出符合条件的组合

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-11-6 07:53 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
问题1:如何用power query 找出1-100内所有三个数(三个数不重复)之和等于100的组合,按首个数字升序排列。如:
1+2+97=100
1+3+96=100
1+4+95=100
……
2+3+95=100
2+4+94=100
……
3+4+93=100
3+5+92=100
……

问题2:升级为不限定三个数组合的凑数(还是用power query解决),见附件
欢迎大咖路过,顺便指导一下,谢谢

问题2_凑数.rar

6.75 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2020-11-6 09:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 libo5563 于 2020-11-6 10:01 编辑

有点啰嗦了,只找了3个数的组合
1.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-6 20:46 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-7 19:48 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第一个问题我自己解决了,第二个不知从哪里下手

TA的精华主题

TA的得分主题

发表于 2020-11-7 21:53 | 显示全部楼层
第1个问题因为是限定了3个数的组合,数据量不大,计算速度没有影响。但第2问题是不限定组合的,一时半会还真想不出有什么好的办法。M函数中使用了迪卡尔集函数List.TransformMany() 进行穷举,然后再用List.Select()函数进行筛选,由于数据太大,List.Select()速度太慢了,目前只做到了组合中包含5个数,如果再下去组合中包含6、7、8..个数的话电脑会卡死。不得不说我的方法可能存在问题,作为一种思路,希望对你有所启发。更希望其他高手分享更好的方法。
详情见附件!

找数组.zip

20.78 KB, 下载次数: 8

问题2_凑数.zip

14.51 KB, 下载次数: 6

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-8 12:46 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-12 19:32 来自手机 | 显示全部楼层
上面的问题我有个想法:能不能构造List,找出所有List中数值个数从1到全部个数的组合,然后再用List. Sum(_)=200进行筛选。可惜功力不够,不能找出所有List的组合。希望大咖能指点一下。

TA的精华主题

TA的得分主题

发表于 2020-11-12 19:59 | 显示全部楼层
cjh-01 发表于 2020-11-12 19:32
上面的问题我有个想法:能不能构造List,找出所有List中数值个数从1到全部个数的组合,然后再用List. Sum(_ ...

原理是这个原理,不过数据多了,普通方法计算量太大。

TA的精华主题

TA的得分主题

发表于 2020-11-13 10:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
第一个:
  1. = Table.FromList(List.RemoveNulls(List.TransformMany(A,(a)=>A,(x,y)=> if 100-x-y<0 then null else Text.From(x)&"+"&Text.From(y)&"+"&Text.From(100-x-y)&"=100")),Splitter.SplitByNothing())
复制代码

第二个没有懂啥意思

TA的精华主题

TA的得分主题

发表于 2020-11-13 11:00 | 显示全部楼层
shaowu459 发表于 2020-11-12 19:59
原理是这个原理,不过数据多了,普通方法计算量太大。

应该用到递归的思想 数据量应该小写
第一次取第一个数,然后200-第一个数 的差 继续凑这个数
这样逐次,递归,筛选,这样应该计算量小写,但代码我不会写
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 15:58 , Processed in 0.054164 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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