Excel 将数字分组,使其总和的差异最小
我发现了一些相似的线索,但我相信我的有点独特。这将很难写,所以请容忍我 我有一个紧张的10个帐户,每个帐户有一个静态的数字,不能分割。我有3名员工需要尽可能将这些账户分开。他们不能共享一个帐户 例如: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
(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个数字(
,48 | J
,38 | I
)开始排序到A、B和C组30 | B
- 下一个最高的数字(
)属于总和最低的组(C)28 | E
- 下一个最高的数字(
)属于总和最低的组(B)28 | H
- 等等
- 上面的解决方案:
81-77=4
- 您的手动解决方案:
85-74=11
此算法是一种近似算法,它不会总是找到最佳解,但如果最低和最高数字之间的差值不太大,则结果非常接近最佳解。这很复杂,但非常适合我的需要。谢谢:)只需提到,对于较大的数字,该算法对于k>2的k路多重划分问题是不切实际的,因为它需要
O(n(k− 1) m^(k)− 1) )
memory,其中m是输入中的最大数字:这使得即使对于k=3也不可行,除非输入是非常小的数字。这非常聪明。我也喜欢这个。这将非常有效。