我正在构建一个程序,从列表中选择总和为给定输入值的最大元素
load_data = [1, 2, 3, 4, 10, 20]
例如,用户输入30
选择20 and 10
或用户输入35
选择20, 10, 4 and 1
,因为它们是可能最大的元素,总计为30
或{{ 1}}
代码
35
输出始终打印
def process(m):
print m
def selection():
aux = range(len(load_data))
global value # <- value is the input
while aux and value > 0:
posit = max(aux) >= value
index = aux[posit]
elem = load_data[index]
value = value - posit # <- subtract max value from input and repeat process
del aux[posit]
process(elem)
答案 0 :(得分:2)
这确实是一项非常复杂的任务。该解决方案仅提供基本方法。它很糟糕,未经审查,例如绩效条款。
import itertools
load_data = [1, 2, 3, 4, 10, 20]
maximum = 35
def selection(data, maximum):
for count in range(1,len(data)+1):
for combination in itertools.combinations(data, count):
if maximum == sum(combination):
yield combination
i = list(selection(load_data, maximum))
print (i)
请尽量避免使用全局变量。这是非常糟糕的风格。
答案 1 :(得分:2)
你在这里:
load_data
,但正如A. Grieco所说,这对问题来说非常简单和基本。
如果load_data
列表是常量,并且始终包含示例中的元素,那么您应该首先对load_data = [1, 2, 3, 4, 10, 20]
global value
value = 30
def process(m):
print m
def selection():
# make a local copy of load_data
data = sorted(load_data[:],reverse=True)
global value # <- value is the input
for v in data:
if value -v >= 0:
value -= v
process(v)
if value -v == 0:
break
selection()
进行降序排序,因此出于优化目的,首先处理较大的元素。
即:
SELECT i.descricao,
sii.quantidade quantidade_inicial,
sii.quantidade * i.valor valor_inicial,
sfi.quantidade quantidade_final,
sfi.quantidade * i.valor valor_final
FROM itensvalor i
LEFT JOIN saldofinalprodutositens sfi
ON i.id = sfi.iditemvalor
AND Isnull(sfi.datahoraexclusao, '') = ''
and sfi.idSaldoFinalProduto IN (SELECT id FROM saldoFinalProdutos WHERE idmovimentodiario = 76)
LEFT JOIN saldoinicialprodutositens sii
ON i.id = sii.iditemvalor
AND Isnull(sii.datahoraexclusao, '') = ''
and sii.idSaldoInicialProduto IN (SELECT id FROM saldoInicialProdutos WHERE idmovimentodiario = 76)