计算可以适合特定数字的一组数字的最佳分布

Calculate the best distribution for a group of numbers that can FIT on a specific number

我有一个我认为很有趣的问题,关于 google 表格和一些数学,这是场景:

4个号码如下:

64.20 | 107 | 535 | 1070

一个参考号,其中之前的数字需要留出最小可能的残差,同时设置每个参考号适合参考号的次数,例如我们可以说参考号如下:

806.45

那么问题来了:

我正在计算这 4 个数字可以包含在参考数字中的次数,方法是从大到小,如下所示:

| 1070 | => =IF(E12/((I15+J15)+IF(H17,K17,0)+IF(H19,K19,0)) > 0,ROUNDDOWN(E12/((I15+J15)+IF(H17,K17,0)+IF(H19,K19,0))),0)

| 535 | => =IF(H15>0,ROUNDDOWN((E12-K15-IF(H17,K17,0)-IF(H19,K19,0))/(I14+J14)),ROUNDDOWN(E12/((I14+J14)+IF(H17,K17,0)+IF(H19,K19,0))))

| 107 | => =IF(OR(H15>0,H14>0),ROUNDDOWN((E12-K15-K14-IF(H17,K17,0)-IF(H19,K19,0))/(I13+J13)),ROUNDDOWN((E12-IF(H17,K17,0)-IF(H19,K19,0))/(I13+J13)))

| 64.20 | => =IF(OR(H15>0,H14>0,H13>0),ROUNDDOWN((E12-K15-K14-K13-IF(H17,K17,0)-IF(H19,K19,0))/(I12+J12)),ROUNDDOWN((E12-IF(H17,K17,0)-IF(H19,K19,0))/(I12+J12)))

正如您所注意到的,我正在检查较高的值是否具有并发性,因此我可以从原始数字中减去金额并再次计算减法结果中较低的数字可以匹配多少次,您还可以看到我在公式中包含了一些复选框,以便将固定数字添加到主数字。

这确实有效,正如您在示例中看到的,结果是:

| 1070 | -> Fits 0 times

| 535 | -> Fits 1 time

| 107 | -> Fits 2 times

| 64.20 | -> Fits 0 times

The residue of 806.45 in this example is: 57.45


但是每一个需要和主号相配的号都要兼顾其他号;如果你手动解决这个练习,你会得到更好的东西..像这样:

| 1070 | -> Fits 0 times

| 535 | -> Fits 1 time

| 107 | -> Fits 0 times

| 64.20 | -> Fits 4 times

The residue of 806.45 in this example is: 14.65

当我说到余数时,我指的是减法的结果,如果不清楚,我很抱歉,我很难用英语解释数学,因为英语不是我的母语,请看电子表格并复制一份以更好地理解我正在尝试做的事情,或者如果可能的话建议我更好地解释它的方法。

那么你会怎么做才能使它在计算后尽可能少的残差下更高效、更“智能”地工作?

这是Google的电子表格供参考和练习,请复制一份以便其他人可以尝试自己的解决方案:

LINK TO SPREADSHEET

在此先感谢您的帮助或提示。

删除H12:H15中的所有当前公式。

然后将这个超级公式放在 H12 中:

=ArrayFormula(QUERY(SPLIT(FLATTEN(SPLIT(VLOOKUP(E12,QUERY(SPLIT(FLATTEN(QUERY(SPLIT(FLATTEN(QUERY(SPLIT(FLATTEN(SEQUENCE(ROUNDUP(E12/I12),1,0)&" "&I12&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)&" "&I13)&"|"&(SEQUENCE(ROUNDUP(E12/I12),1,0)*I12)+(TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)*I13))),"|"),"Select Col1")&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I14),1,0)&" "&I14)&"|"&QUERY(SPLIT(FLATTEN(SEQUENCE(ROUNDUP(E12/I12),1,0)&" "&I12&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)&" "&I13)&"|"&((SEQUENCE(ROUNDUP(E12/I12),1,0)*I12)+(TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)*I13)))),"|"),"Select Col2")+TRANSPOSE(SEQUENCE(ROUNDUP(E12/I14),1,0)*I14)),"|"),"Select Col1")&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I15),1,0)&" "&I15)&"|"&QUERY(SPLIT(FLATTEN(QUERY(SPLIT(FLATTEN(SEQUENCE(ROUNDUP(E12/I12),1,0)&" "&I12&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)&" "&I13)&"|"&(SEQUENCE(ROUNDUP(E12/I12),1,0)*I12)+(TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)*I13))),"|"),"Select Col1")&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I14),1,0)&" "&I14)&"|"&QUERY(SPLIT(FLATTEN(SEQUENCE(ROUNDUP(E12/I12),1,0)&" "&I12&" / "&TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)&" "&I13)&"|"&((SEQUENCE(ROUNDUP(E12/I12),1,0)*I12)+(TRANSPOSE(SEQUENCE(ROUNDUP(E12/I13),1,0)*I13)))),"|"),"Select Col2")+TRANSPOSE(SEQUENCE(ROUNDUP(E12/I14),1,0)*I14)),"|"),"Select Col2")+TRANSPOSE(SEQUENCE(ROUNDUP(E12/I15),1,0)*I15)),"|"),"Select Col2, Col1 WHERE Col2 <= "&E12&" ORDER BY Col2 Asc, Col1 Desc"),2,TRUE)," / ",0,0))," "),"Select Col1"))

通常,我会解释我的公式。在这种情况下,我相信读者会理解我为什么无法解释。我只能按工作顺序提供。

简单的给个大致的思路,这个公式计算出四个数分别对应目标数的次数alone 然后添加所有这些的所有可能组合。然后将这些限制为仅小于目标数量的组合,并按总数从小到大排序。然后 VLOOKUP 在该列表中查找目标数字,returns 最接近的匹配项,SPLITs 金额的倍数(最后,已连接成长字符串) , 而 returns 只有倍数。