You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求列中满足和≥总和50%的最少数据点数量的紧凑实现方案

求列中满足和≥总和50%的最少数据点数量的紧凑实现方案

嘿,这个需求我刚好碰过类似的,其实用Excel的函数就能写出超紧凑的解决方案,不管你列里有几百还是几千条数据,都能瞬间出结果,而且复制到8列上复用特别方便。

核心思路很简单:要找最少的数据点,肯定得优先加最大的数对吧?所以我们先把列里的数从大到小排序,然后逐个累加,找到第一个累加和达到总和50%的位置,这个位置就是你要的数量。

针对Excel 365/2021(支持动态数组和LAMBDA)的紧凑公式

如果你的Excel是新版本,直接用这个公式就行,比如针对A列:

=MATCH(TRUE, SCAN(0, SORT(A:A,,-1), LAMBDA(acc, val, acc+val)) >= SUM(A:A)*0.5, 0)

我给你拆解下每个部分:

  • SORT(A:A,,-1):把A列数据从大到小排序,确保我们先加最大的数,用最少的数量凑够阈值
  • SCAN(0, ..., LAMBDA(acc, val, acc+val)):对排序后的数组做累加,生成一个累加和数组——第一个元素是最大的数,第二个是前两大的数的和,以此类推
  • >= SUM(A:A)*0.5:判断每个累加和是否达到总和的50%,得到一串TRUE/FALSE的结果
  • MATCH(TRUE, ..., 0):找到第一个TRUE出现的位置,这个就是满足条件的最少数据点数量

旧版Excel(无动态数组)的替代方案

如果你的Excel版本比较旧,没法用LAMBDA函数,可以用这个数组公式(输入的时候要按Ctrl+Shift+Enter):

=MATCH(TRUE, SUBTOTAL(9, OFFSET(A1,0,0,ROW(INDIRECT("1:"&COUNTA(A:A))),1))>=SUM(A:A)*0.5,0)

注意:用这个公式前,需要先手动给目标列做降序排序,确保最大的数在最前面。

验证你的例子

你提到的0-100的列,总和是5050,50%就是2525。用第一个公式计算的话,前30大的数是71到100,它们的和是(71+100)*30/2=2565,刚好超过2525;而前29大的数和是2494,不够。公式会准确返回30,完全符合你的预期。

复用技巧

要用到8列上的话,直接把公式里的A:A换成对应的列(比如B:B、C:C)就行,复制粘贴8次,全程不用改其他参数,超级省事。

备注:内容来源于stack exchange,提问作者Alex Robinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:29:29