我遇到一个问题,我有一组有限的值,比如说:
[1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10]
我想写一个算法,在其中我提供一个目标值,其中返回两个(数量,值)对的列表,以便遵循以下规则。规则按重要性递减的顺序列出,未编号的规则是“很好”的规则。但请注意“必须拥有”。
我的问题如下:此问题的参数是否属于任何“经典”或众所周知/研究过的计算机算法?如果某些条件被调整,可能会使这个问题看起来更像是一个经典的'优化问题?
我感兴趣的是以“蛮力”之外的任何其他方式解决这个问题,但是我对不同优化问题的了解很少。
以下是一些例子:
#------Example 1------------
print(find_combination(16.5))
# output = ({'qty':1, value:4.5},
# {'qty':2, value:6})
# The following is invalid because the sum of qty is
# equivalent but more half values are used
# output = ({'qty':3, value:5.5})
#------Example 2------------
print(find_combination(15))
# output = ({'qty':3, value:5})
# The following is invalid because it uses more half
# values, and the sum of the quantity is not at least
# two less than the above answer
# output = ({'qty':2, value:7.5})
#------Example 3------------
print(find_combination(12))
# output = ({'qty':2, 'value':6})
# The following is invalid because the two values are
# not within two of each other. Also, the number of
# different values was not minimized
# output = ({'qty':1, 'value':2},
{'qty':1, 'value':10})
答案 0 :(得分:1)
这有什么好处:
largest = largest value in the list
if (target <= largest) {
search for it in the list, and maybe make a sum of two elements if there's a gap where the target would be
} else {
n = target / largest
try larger n with smaller values from the allowed set, to check for an exact match.
Maybe do something clever with the remainder of target/largest to avoid skip some trial-divisions
}
嗯,如果你没有所有其他限制条件,比如数量在2彼此之内,这可能是一个好的开始。
使用列表中的最小值与&#34;保持最小的数量和#34;冲突。因此,我假设您只想查找较小的列表值,而不会增加与另一个候选解决方案相比的数量总和。
如果目标是其中一个列表值的精确倍数,那么您的规则甚至不会说您应该返回一对,但我认为这是一个目标。 (规则只说当目标实际上在集合中时,数量= 1)。
我现在要放弃,直到你明确规定实际是什么。