2016-12-02 67 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