Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将数字分组,使其总和的差异最小_Excel_Excel Formula_Vba - Fatal编程技术网

Excel 将数字分组,使其总和的差异最小

Excel 将数字分组,使其总和的差异最小,excel,excel-formula,vba,Excel,Excel Formula,Vba,我发现了一些相似的线索,但我相信我的有点独特。这将很难写,所以请容忍我 我有一个紧张的10个帐户,每个帐户有一个静态的数字,不能分割。我有3名员工需要尽可能将这些账户分开。他们不能共享一个帐户 例如: (A)lpha = 15 (B)eta = 30 (C)harlie = 22 (D)elta = 19 (E)cho = 28 (F)ranklin = 3 (G)roto = 7 (H)enry

我发现了一些相似的线索,但我相信我的有点独特。这将很难写,所以请容忍我

我有一个紧张的10个帐户,每个帐户有一个静态的数字,不能分割。我有3名员工需要尽可能将这些账户分开。他们不能共享一个帐户

例如:

(A)lpha    = 15    
(B)eta     = 30    
(C)harlie  = 22    
(D)elta    = 19    
(E)cho     = 28    
(F)ranklin = 3    
(G)roto    = 7    
(H)enry    = 28    
(I)ndia    = 38    
(J)uliet   = 48
总数为=238。在完美的世界里,两个人得到79分,一个人得到80分。但是,请记住,我们不能拆分一个帐户,因此我们需要将帐户添加到一起,以尽可能接近均匀分布

我需要一个公式,因为这样的情况经常发生,需要一些时间才能弄清楚。我相信最好使用helper列来执行此操作

我最接近的是:

FHJ  = 79
ABCG = 74
DEI  = 85
但是,由于这种情况会再次发生,并且可能会发生在更多的帐户上,因此我需要一些可以反复使用的东西。

这就是所谓的。您可以尝试从Wikipedia页面实现伪多项式时间算法。您必须为3个分区而不是2个分区修改它

INPUT:  A list of integers S
OUTPUT: True if S can be partitioned into two subsets that have equal sum
1 function find_partition(S):
2     n ← |S|
3     K ← sum(S)
4     P ← empty boolean table of size (floor(K/2)+ 1) by (n + 1)
5     initialize top row (P(0,x)) of P to True
6     initialize leftmost column (P(x, 0)) of P, except for P(0, 0) to False
7     for i from 1 to floor(K/2)
8         for j from 1 to n
9             if (i-S[j-1]) >= 0
10               P(i, j) ← P(i, j-1) or P(i-S[j-1], j-1)
11            else
12               P(i, j) ← P(i, j-1)
13    return P(floor(K/2), n)

另一个不太复杂但近似的解决方案是

  • 将您的帐户从最高编号排序到最低编号
  • 开始将数字分为3组(A、B、C)
    • 从最高的3个数字(
      48 | J
      38 | I
      30 | B
      )开始排序到A、B和C组
    • 下一个最高的数字(
      28 | E
      )属于总和最低的组(C)
    • 下一个最高的数字(
      28 | H
      )属于总和最低的组(B)
    • 等等
  • 您应该以以下方式结束:

    这与手动解决方案不同,但更接近。如果您看到了差异:

    • 上面的解决方案:
      81-77=4
    • 您的手动解决方案:
      85-74=11

    此算法是一种近似算法,它不会总是找到最佳解,但如果最低和最高数字之间的差值不太大,则结果非常接近最佳解。

    这很复杂,但非常适合我的需要。谢谢:)只需提到,对于较大的数字,该算法对于k>2的k路多重划分问题是不切实际的,因为它需要
    O(n(k− 1) m^(k)− 1) )
    memory,其中m是输入中的最大数字:这使得即使对于k=3也不可行,除非输入是非常小的数字。这非常聪明。我也喜欢这个。这将非常有效。