算法将数字排序成具有特定总和的集合

时间:2017-08-22 11:26:31

标签: arrays algorithm sorting subset-sum

我有27块硬木地板条,长度从18到48英寸不等。我想制作3个木板,每个木板由3排地板组成。两块木板必须是60"很长,另一块木板必须是72"长。所有条带的总长度足以构造这些木板。显然我可以随意选择条带,将它们粘合起来并将它们剪裁成大小。但是我想尽量减少浪费。

问题可以更简单地重申:我有27个整数,并希望将它们分为9组。 6组中的每一组加起来为60,其余三组中的每一组加起来为72.这个问题是子集和问题的变化。

我发现了一些帖子正在讨论' dynamic programming'但我对这种方法一无所知,更不用说如何编码了。

前一段时间问了similar问题,但缺乏讨论。

我的方法是谷歌方式'。蛮力。计算一切。稍后解决。所以,

将整数分为9个3个数组。注意有9个!/ 3! = 60480分组。

每组

计算每个数组的总和,将其称为ArraySum。其中有9个。

(A,B,C,D,E,F,G,H,I)

计算与目标总和的差异(72,60,60)

A-72,B-72,C-72, D-60, E-60,...

将该组的所有差异加起来并存储该数字(称之为GroupSum)。这是我想要最小化的数字。

置换ArraySums和Target Sums之间的成对差异(9!/ 3!= 60480)

现在返回,更改分组并重复。 我得到60480 x 60480 GroupSums = 3657830400

对groupsums进行排序,找到最低的groupum,选择该分组。

有比预先计算和排序更好的方法吗?

1 个答案:

答案 0 :(得分:1)

除非我误解了某些内容,否则只要你能找到一个完全有效的分组(即所有群组至少都是所需的长度),你的分组似乎无关紧要。

逻辑是你从完全所需数量的条带开始,这意味着无论如何你都需要使用它们。你需要的条带总长度是恒定的(60 * 6 + 72 * 3),你将使用的总长度也是如此(无论你的总和是多少),所以废物是一个常数 - 无论它们之间的差异如何是。如果我理解正确,贪婪的算法应该做到这一点 - 只需使用任何组合为每个给定的木板提供最小的结果,任意解决关系,然后继续下一步。

除非你想最大限度地减少需要切割的条带数量,即将所有“废物”分配给尽可能少的条带。在这种情况下,你应该使用L0损失函数,而不是你建议的L1(即你想最小化和的数量!= 0,而不是和本身的值)