我有一个用整数填充的数组(排序或未排序,以较容易的方式,但在这里我将对其进行排序):
10,20,20,30,40
我尝试做的是获得这些数字的两个最小总和。在这种情况下,它应该是60
,因为:
10+20+30 = 60
和20+40 = 60
。我试图做的是当我对数组进行排序时,分开的数字是第一个左,右,左,右......但是我没有得到最小的总和。在这种情况下,使用我的算法,我会得到以下总和:
10+20+40 = 70
和20+30 = 50
不是很有效。
您知道,我正在研究时间管理算法,因此我希望尽可能地获得最佳时间。
答案 0 :(得分:0)
会有N!如果没有重复,则从N个数字中选择一个组的方法。生成所有可能的组。最佳组合的最小金额不低于总数的一半,因为其他数字的总和不超过一半。
答案 1 :(得分:0)
我认为这与装箱问题的精神更接近。 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]