2016-12-02 2 views
1

Я строю программу, которая выбирает максимальные элементы из списка, который подводит к заданному входному значениюВыбор макс элементов из списка с помощью входного значения Python

load_data = [1, 2, 3, 4, 10, 20] 

например пользователь вводит 30 выбрать 20 and 10 или пользовательские входы 35 выберите 20, 10, 4 and 1 поскольку они являются возможными крупные элементы, которые в сумме дают 30 или 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) 

выход всегда печатает

2 
3 
1 
4 
10 
20 
+3

это не простая задача, и я не уверен, что вы понимаете его сложность (программно говоря). Я не могу придумать способ сделать это, который не использует рекурсию. –

+0

Вы можете найти следующий SO-вопрос полезен: http://stackoverflow.com/questions/3420937/algorithm-to-find-which-number-in- a-list-sum-up-to-an-number – dodell

+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) 

И, пожалуйста, избегайте использования глобальных переменных. Это очень плохой стиль.

+2

Может использовать 'itertools.combinations' вместо перестановок, он уменьшает повторяющиеся значения – Skycc

+0

@Skycc очень хорошая точка! Пропустил это полностью. – infotoni91

+1

Если вместо этого вы получаете комбинацию, вы можете получить список всех комбинаций, суммы которых равны «максимум», например. 'list (selection (load_data, 35))' -> '[(1, 4, 10, 20), (2, 3, 10, 20)]'. Я думаю, что это обобщит ваш ответ. – pylang

2

Здесь вы:

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 = load_data[:] 
    global value # <- value is the input 
    while data and (value > 0): 
     maxval = max(data) 
     posix = data.index(maxval) 
     if posix >=0: 
      value = value - data[posix] # <- subtract max value from input and repeat process 
      process(data[posix]) 
      data.pop(posix) 
selection() 

, но, как сказал А. Грико, это очень простой и основной ПОДХОД К проблеме.

Если список load_data является постоянным и всегда имеет элементы из примера, то сначала нужно просто отсортировать по убыванию 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() 
+0

может просто использовать' data = sorted (load_data, reverse = True) 'вместо функции сравнения – Skycc

+0

Спасибо Skycc. Код теперь улучшен. –

+0

Краткий пример. Есть ли причина использовать «глобальный»? Почему бы не использовать параметр функции передать значение, например. 'def select (value): ...' then call 'selection (30)'. – pylang