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

Algorithm 将n个元素划分为k个组,并且这些组的和必须相同,algorithm,list,numbers,computer-science,Algorithm,List,Numbers,Computer Science,我需要把n个元素分成k个组,这些组的和都是一样的 例如: 我有一个从1到99的数字列表[1,2,3,4,5…],我需要将列表分成3组。每个组的所有元素之和必须相等。在本例中,n=99,k=3 实现这一点的高效而优雅的算法是什么? 我只是想问一下使用算法的建议;我不想要一个解决方案。让我先澄清一点:当你说你想要一个算法,但没有解决方案时,我必须假设你的意思是你想要一个算法,它可以为k=3和n任何正整数提供一个解决方案 如果n或n+1可以被3整除,我相信这个问题对于任何n>=5都有一个解决方案 这是

我需要把n个元素分成k个组,这些组的和都是一样的

例如:

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

实现这一点的高效而优雅的算法是什么?
我只是想问一下使用算法的建议;我不想要一个解决方案。

让我先澄清一点:当你说你想要一个算法,但没有解决方案时,我必须假设你的意思是你想要一个算法,它可以为
k=3
n
任何正整数提供一个解决方案

如果
n
n+1
可以被3整除,我相信这个问题对于任何
n>=5
都有一个解决方案

这是因为总和
1+…+n
等于
n*(n+1)/2
,可被3整除,当且仅当
n
n+1
可被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).
m + (m - 1) + (m - 2) + ... + q  <=  s  <  m + (m - 1) + (m - 2) + ... + q + (q - 1),
请记住,这些总和可能包括
h+1
h-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]

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

例如(好吧,是的,这是一个解决方案——但仅用于说明目的……):


这里的
n=99
m=95
h=65
q=89
,和
p=1
,一个好的开始是知道每个分区的总和应该是
n/k
。如果n=50,那么列表中会包含1到50吗?还是随机?如果数字是随机的,很容易发现与子集和问题的相似之处。特别是,你要找的是k-way。你列表中的数字总是连续的吗?你只需要找到一个解决方案吗?
1 + ... + 99 = 99*100/2 = 3*550
             = (99 + 98 + 97 + 96 + 95 + 65)
             + (94 + 93 + 92 + 91 + 90 + 89 + 1)
             + (88 + ... + 66 + 64 + ... + 2).