【发布时间】:2018-02-07 23:54:58
【问题描述】:
我在下面有一个脚本,它给出了最接近给定总和的 2 个值。它还遍历给定总和的列表,并在每次迭代后删除已使用的数字。
我需要修改这个脚本,以便它产生最接近每个总和的必要数量的值,而不是 2。脚本需要接受浮点值并且不能重复使用值。实际上,它需要选择最接近目标的最有效集合,更新集合以删除使用的值,然后移动到下一个目标等。
对于需要 3 个数字或 4 个等才能真正接近总和的特定用例/集合,它不能很好地工作。我需要这个脚本也能够接受浮点值,这个脚本目前可以。
任何建议将不胜感激。另外,如果有人知道更好的脚本,请告诉我。
import sys
def find_closese_sum(numbers, target):
start = 0
end = len(numbers) - 1
result = sys.maxint
result_tuple = None
while start < end:
if numbers[start] + numbers[end] == target:
print 0, (numbers[start], numbers[end])
return
elif numbers[start] + numbers[end] > target:
if abs(numbers[start] + numbers[end] - target) < result:
result = abs(numbers[start] + numbers[end] - target)
result_tuple = (numbers[start], numbers[end])
end -= 1
else:
if abs(numbers[start] + numbers[end] - target) < result:
result = abs(numbers[start] + numbers[end] - target)
result_tuple = (numbers[start], numbers[end])
start += 1
for i in result_tuple:
numbers.remove(i)
return result_tuple
if __name__ == "__main__":
target = [14,27,39]
numbers = [1,5,5,10,7,8,11,13,66,34]
print numbers
numbers = sorted(numbers)
for i in target:
result_shown = find_closese_sum(numbers, i)
print result_shown
【问题讨论】:
-
这是subset sum problem。是NP-complete;这并不一定意味着没有比蛮力更好的方法,但它可能意味着没有明显更好的方法。讨论at this other question.
-
@PhilippVengrinovich 在您的示例中,
numbers = [1,5,5,10,7,8,11,13,66,34],您有两个值 5。如果对于第二个目标数字,组合包含 5,应该从numbers列表中删除哪个 5?第一?第二个?还是两者兼而有之? -
即如果使用5,更新后的序列应该是什么:
[1,10,7,8,11,13,66,34]或[1,5,10,7,8,11,13,66,34]? -
@AGNGazer 在回答你的问题时,它应该是第二个序列。因此,如果任何组合使用 5,则应从列表中删除该单个 5,但应保留其他组合。
标签: python python-2.7 subset-sum