2016-12-02 64 views
1

選擇從列表中最大元素我建立從其求和到一個給定的輸入值的列表中選擇最大元素的程序使用輸入值的Python

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

例如用戶輸入30選擇20 and 10或用戶輸入35選擇20, 10, 4 and 1因爲它們是可能的最大元素總結到3035

代碼

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-certain-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() 

,但A. GRIECO說,這是非常簡單和基本的形式給出了對問題。

如果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

簡潔的例子。是否有理由使用'global'?爲什麼不使用函數參數傳遞值例如'def selection(value):...'然後調用'selection(30)'。 – pylang