【问题标题】:Find sum of number in multiple sets using exactly one number of each set使用每个集合中的一个数字查找多个集合中的数字总和
【发布时间】:2021-07-05 15:46:06
【问题描述】:

背景

您好,我正在尝试解决编程问题,但遇到以下问题:

假设您有多个数字列表。全部按降序排列。 现在,您必须从每个列表中只取一个数字才能使总和尽可能大。

到目前为止很容易,要解决这个问题,您只需获取每个列表的第一个数字即可。

但是现在,我需要第二大的总和,同时仍然只使用每个列表中的一个数字。 为了实现这一点,我会采用每个列表中的第一个元素,但对于第一个和第二个数字之间差异最小的列表,将使用第二个数字。

这还是很可行的。

问题

但我需要一个迭代器,使用按降序排序的每个列表中的一个数字来处理每个可能的总和。
出于性能原因,不可能只计算每个总和然后对其进行排序。该算法必须已经按降序提供总和。如果总和有多个组合,则总和必须多次返回。

附加要求

迭代器应该是惰性的(仅在需要时计算下一个总和)。
列表已经是惰性的,这意味着您应该需要尽可能少的值来计算拟合总和。

示例

对于列表:

List 1: [5, 2, 1]
List 2: [10, 2]
List 3: [6, 1]

然后迭代器应该返回:

[5, 10, 6] = 21
[2, 10, 6] = 18
[1, 10, 6] = 17
[5, 10, 1] = 16
[5,  2, 6] = 13
[2, 10, 1] = 13
[1, 10, 1] = 12
[2,  2, 6] = 10
[1,  2, 6] = 9
[5,  2, 1] = 8
[2,  2, 1] = 5
[1,  2, 1] = 4

评论

我不需要代码来回答我的问题(如果它有助于解释,我们仍然欢迎您提供它)。我正在寻找解决这个问题的想法,或者我可以自己实施的解决方案。

提前致谢!

【问题讨论】:

  • 你自己尝试过什么?
  • 您找到第二大总和的想法似乎是正确的要提出解决方案,您应该考虑如何从那里获得第三大总和,然后对其进行概括。在你想出一个模式之后,你可以更多地关注优化。作为提示,您可以考虑选择下一个值并生成下一个可能的选择作为 bfs 的轮廓。
  • 我尝试的是只取比以前最差的元素。这导致跳过许多总和。下一个想法是取出减少最少的那个,固定它,然后按降序使用其他的。这会导致错误的顺序。我目前的尝试是每次我在其中一个列表中生成一个新项目时,我都会暴力破解其他列表中所有已使用的项目。这并不完全是懒惰,但足够懒惰。我现在想知道是否存在真正的惰性方法。

标签: list algorithm math iterator lazy-evaluation


【解决方案1】:

首先,感谢 wlui155 的帮助。

对于任何感兴趣的人,我编写了一个 BFS 算法,其作用如下:

定义:
条目:包含已使用数字和总和索引的结构
BSet:只能包含唯一条目的有序集合

算法:

  1. BSet 中总和最大的 Pop 条目
  2. 为每个列表创建一个克隆
  3. 在每个克隆中将不同的索引提高一个
  4. 在 BSet 中添加新条目
  5. 打印当前条目
  6. 转到 1。

现在您只需确保在弹出条目后不再出现条目。这可以通过包含当前总和的所有组合的单独集合来确保。一旦当前总和变小,这个集合就可以被清除。

如果您有改进的想法,欢迎告诉我。

【讨论】:

  • 您能否澄清一下哪些列表在 2 中被克隆,为什么?
  • 另外,如果我们在每个克隆中将不同的索引推进一个,即使我们有访问集,我们是否会通过重复执行很多额外的工作? (例如,如果我理解正确,[0,1] 和 [1,0] 都可能导致尝试 [1,1] 并检查访问集。)
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 2019-02-13
  • 2015-10-30
  • 2021-05-14
  • 1970-01-01
相关资源
最近更新 更多