[已解决] 找出符合条件的组合

  [复制链接]
查看125060 | 回复128 | 2020-12-18 06:10:03 | 显示全部楼层 |阅读模式
问题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解决),见附件
欢迎大咖路过,顺便指导一下,谢谢

10787111247553.rar (6.75 KB, 下载次数: 0)
回复

使用道具 举报

莲儿 | 2020-12-18 06:18:03 | 显示全部楼层
有点啰嗦了,只找了3个数的组合
10787111247551.jpg
回复

使用道具 举报

jack | 2020-12-18 06:20:03 | 显示全部楼层
顶一下,大家关注一下
回复

使用道具 举报

朗月星空 | 2020-12-18 06:25:03 | 显示全部楼层
第一个问题我自己解决了,第二个不知从哪里下手
回复

使用道具 举报

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

使用道具 举报

pic | 2020-12-18 06:35:04 | 显示全部楼层
谢谢,我再看看!
回复

使用道具 举报

time | 2020-12-18 06:40:04 | 显示全部楼层
上面的问题我有个想法:能不能构造List,找出所有List中数值个数从1到全部个数的组合,然后再用List. Sum(_)=200进行筛选。可惜功力不够,不能找出所有List的组合。希望大咖能指点一下。
回复

使用道具 举报

liyin | 2020-12-18 06:45:04 | 显示全部楼层
上面的问题我有个想法:能不能构造List,找出所有List中数值个数从1到全部个数的组合,然后再用List. Sum(_ ...


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

使用道具 举报

dg_gaga | 2020-12-18 06:51:05 | 显示全部楼层
第一个:
  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())
复制代码


第二个没有懂啥意思
回复

使用道具 举报

nikos | 2020-12-18 06:57:05 | 显示全部楼层
原理是这个原理,不过数据多了,普通方法计算量太大。


应该用到递归的思想 数据量应该小写
第一次取第一个数,然后200-第一个数 的差 继续凑这个数
这样逐次,递归,筛选,这样应该计算量小写,但代码我不会写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则