【问题标题】:Choosing minimum numbers from a given list to give a sum N( repetition allowed)从给定列表中选择最小数字以给出总和 N(允许重复)
【发布时间】:2019-02-02 20:25:04
【问题描述】:

如何找到从列表中取出的元素可以向给定数字求和的最小方式数(N) 例如,如果 list = [1,3,7,4] 和 N=14 函数应该返回 2 作为 7+7=14 同样,如果 N= 11,函数应该返回 2 作为 7+4 =11。我想我已经弄清楚了算法,但无法在代码中实现它。 请使用 Python,因为这是我理解的唯一语言(目前) 对不起!!!

【问题讨论】:

  • 请分享您到目前为止所尝试的内容
  • 这一切都在我的笔记本里,只是伪代码和步骤。我知道这不可能是正确的。

标签: python-3.x recursion dynamic-programming


【解决方案1】:

由于您在问题中提到了动态编程,并且您说您已经弄清楚了算法,因此我将仅包括用 Python 编写的基本表格方法的实现,而无需过多理论。 这个想法是有一个表格结构,我们将使用它来计算我们需要的所有可能值,而不必多次进行相同的计算。 对于每个目标值,基本公式将尝试对列表中的值求和,直到达到目标值。

它应该可以工作,但您当然可以进行一些优化,例如尝试对列表进行排序和/或查找红利,以构建更小的表并更快地终止。

代码如下:

import sys

# num_list : list of numbers
# value: value for which we want to get the minimum number of addends

def min_sum(num_list, value):

    list_len = len(num_list)

    # We will use the tipycal dynamic programming table construct
    # the key of the list will be the sum value we want, 
    # and the value will be the
    # minimum number of items to sum

    # Base case value = 0, first element of the list is zero   
    value_table = [0]

    # Initialize all table values to MAX
    # for range i use value+1 because python range doesn't include the end
    # number
    for i in range(1, value+1):
        value_table.append(sys.maxsize);

    # try every combination that is smaller than <value>
    for i in range(1, value+1):
        for j in range(0, list_len):
            if (num_list[j] <= i):
                  tmp = value_table[i-num_list[j]]
                  if ((tmp != sys.maxsize) and (tmp + 1 < value_table[i])):
                      value_table[i] = tmp + 1

    return value_table[value]



## TEST ##
num_list = [1,3,16,5,3]
value = 22
print("Min Sum: ",min_sum(num_list,value)) # Outputs 3

【讨论】:

    【解决方案2】:

    如果您将算法包含在伪代码中会很有帮助 - 它看起来非常像 Python :-)

    另一方面:您的第一个操作是与列表中的一个项目 (7) 和列表之外的一个项目 (2) 相乘,而对于第二个操作,它是 7+4 - 列表中的两个值。

    对使用哪个操作或使用哪些项目有限制(来自列表内或列表外)?

    【讨论】:

    • 我应该写 7+7 而不是 7×2 我的错。所有元素必须仅来自列表。只允许加法操作。
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多