将n个元素划分为k个组,并且这些组的总和必须相同

时间:2019-07-12 07:31:38

标签: algorithm list numbers computer-science

我需要将n个元素划分为k个组,这些组的总和都相同。

例如:

我有一个从1到99 [1、2、3、4、5 ...]的数字列表,我需要将该列表分成3组。每个组的所有元素的总和必须相等。在此示例中,n = 99,k = 3。

什么是有效且优雅的算法来实现这一目标? 我只是在要求使用算法建议;我不想解决。

1 个答案:

答案 0 :(得分:0)

让我先澄清一下:当您说想要一种算法,但没有解决方案时,我必须假设您的意思是您想要一种能够为k=3提供解决方案的算法,并且n任何正整数。

我相信只要n >= 5n被3整除,这个问题就可以解决所有n+1的问题。

这是因为总和1 + ... + n等于n*(n+1)/2,当且仅当nn+1可以被3整除时,总和才能被3整除。

假设n满足这些条件,该算法将如下所示。

s = [n*(n+1)/2]/3

按递减顺序m找到数字n, n-1, n-2, ...,,这样

n + (n - 1) + (n - 2) + ... + m  <=  s  <  n + (n - 1) + (n - 2 ) + ... + m + (m - 1).

h = s - [n + (n - 1) + (n - 2) + ... + m]

然后h + [n + (n - 1) + (n - 2) + ... + m] = s,我们有了第一笔款项。

请注意,根据m的获得方式,可以保证h处于递减序列m-2, m-3, ..., 1,中,因此可用于我们的第一个和。

我们现在发现降序m-1, m-2, ..., h+1, h, h-1, ..., 1,中的数字q使得

m + (m - 1) + (m - 2) + ... + q  <=  s  <  m + (m - 1) + (m - 2) + ... + q + (q - 1),

请记住,这些金额可能包括h+1h-1,但 h 我是在此处滥用总和的符号约定。

这是毛茸茸的地方。

我猜想数字p = s - [m + (m - 1) + (m - 2) + ... + q]是原始序列剩下的数字(未使用),但是我不会证明这一点。 (正如他们所说的,为读者提供锻炼。)

然后p + [m + (m - 1) + (m - 2) + ... + q] = s,,我们有了第二笔款项。

(同样:数字h可能[m + (m - 1) + (m - 2) + ... + q]之和。)

最后一个总和是原始序列中剩下的所有剩余数字的总和。

例如(嗯,是的,解决方案---但仅出于说明目的...):

1 + ... + 99 = 99*100/2 = 3*550
             = (99 + 98 + 97 + 96 + 95 + 65)
             + (94 + 93 + 92 + 91 + 90 + 89 + 1)
             + (88 + ... + 66 + 64 + ... + 2).

此处n = 99m = 95h = 65q = 89p = 1