【问题标题】:Smallest two sums of integers in array数组中最小的两个整数和
【发布时间】:2017-04-03 05:23:45
【问题描述】:

我有一个用整数填充的数组(排序或未排序,以更容易的为准,但在这里我会对其进行排序):

10,20,20,30,40

我试图做的是得到这些数字的两个最小的总和。在这种情况下,应该是60,因为:

10+20+30 = 6020+40 = 60。我试图做的是当我对数组进行排序时,拆分第一个向左,第二个向右,向左,向右的数字......但我没有得到最小的总和。在这种情况下,使用我的算法,我会得到以下总和:

10+20+40 = 7020+30 = 50 这不是很有效。

您知道,我正在研究一种时间管理算法,因此我希望获得尽可能小的最佳时间。

【问题讨论】:

  • 查找“背包问题”或“背包问题”。
  • 为什么不把 10 + 20 = 30 作为最小的和?
  • @Jean-FrançoisFabre 谢谢伙计,它有效! 10+20 = 30 是最小的总和,但其余的总和更大,这是我们不想要的。例如,你和你的朋友送披萨,你们想尽快一起去吃午饭。你会不会只给他30 而你拿走其余的,在这种情况下是90
  • (问题可能被改写为将一组整数分成两部分,总和尽可能接近。)

标签: c arrays algorithm sorting


【解决方案1】:

会有N!如果没有重复,从 N 个数字中选择一组的方法。生成所有可能的组。最好的组有最小的总和不小于总数的一半,因为其他数字的总和不超过一半。

【讨论】:

  • 这太天真了,而他可能正在寻求优化的解决方案。
  • @EliKorvigo OP 说背包太复杂了,你想做什么?模拟退火?
  • 我没看到OP说,那个背包太复杂了。
【解决方案2】:

我认为这在精神上更接近垃圾箱包装问题。 https://en.wikipedia.org/wiki/Bin_packing_problem

那里的贪心算法适用于您的测试用例

首先,对数组进行排序

[40,30,20,20,10]

初始化两个空箱

A=[] b=[]

在每一步中,从数组中删除最大的元素并将其放入总和最小的 bin 中(如果它们的总和相等,则将其放入 A)

对于您的数组,它的工作原理如下

step 0:
[40,30,20,20,10]
A=[] B=[]

step 1:
[30,20,20,10]
A=[40] B=[]

step 2:
[20,20,10]
A=[40] B=[30]

step 3:
[20,10]
A=[40] B=[30,20]

step 4:
[10]
A=[40,20] B=[30,20]

step 4:
[]
A=[40,20] B=[30,20,10]

你得到了想要的答案。当然,您可以找到失败的集合,这是一个近似算法。例如,[50,49,33,33,33]

【讨论】:

  • 谢谢,但这并不能解决我一直在寻找的问题,而且正如你所说,由于各种整数集,某些集无法在我的程序中发生。
猜你喜欢
  • 2015-08-28
  • 2022-11-27
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多