获取总和为X的数组的数字列表[重复]

Posted

技术标签:

【中文标题】获取总和为X的数组的数字列表[重复]【英文标题】:Get list of numbers form Array Whose sum is X [duplicate] 【发布时间】:2020-10-13 13:01:41 【问题描述】:

我有一个号码,比如说27 和一个NumbersList 的列表。如何从NumbersList 获得一些选定的数字,其中一些是 27。以及使用来自NumbersList 的最大数字 这可以通过抛出所有可能性来完成,但我内心深处知道有一个简单的解决方案,但我想多了。

#available numbers
NumbersList = [1,5,9,4,6,8,12,12,1,3,6,8,7,8,2]

def GetNumbers(number):
    global NumbersList
    tmpList = []

    #Some magical code

    return tmpList


#now result have
result = GetNumbers(27)
# result is  [12, 12, 3]
# 12+12+3 using most possible greater numbers from "NumbersList"

【问题讨论】:

【参考方案1】:

你可以试试

NumbersList = [1,5,9,4,6,8,12,12,1,3,6,8,7,8,2]

def GetNumbers(number):        
    result = []
    for i in sorted(NumbersList, reverse=True):
        if sum(result) + i <= number:
            result.append(i)
    return result

或者如果NumbersList 很大,那么你可以减少迭代

def GetNumbers(number):
    result = []
    for i in sorted(NumbersList, reverse=True):
        sum_list = sum(result)
        if sum_list + i == number:
            result.append(i)
            return result
        elif sum_list + i < number:
            result.append(i)
    return result

print(GetNumbers(27))

输出

[12, 12, 3]

【讨论】:

如何优先考虑列表末尾的数字而不是更大的数字? 从排序方法中移除 reverse=True【参考方案2】:

这是一种方法

NumbersList = [1,5,9,4,6,8,12,12,1,3,6,8,7,8,2]

def GetNumbers(NumbersList, number):
    tmpList = []
    summ = 0
    srtd = sorted(NumbersList)
    for i in range(len(srtd)-1, 0, -1):
        if summ + srtd[i] > number:
            break
        summ += srtd[i]
        tmpList.append(srtd[i])
    for i in range(len(NumbersList)):
        if NumbersList[i] == number - summ:
            tmpList.append(NumbersList[i])
    if sum(tmpList) == number:
        return tmpList
    else:
        return None

result = GetNumbers(NumbersList, 27)
print(result)

当然不是最好的,但可以做到这一点。

首先,您对列表进行排序,找到所有不超过限制的最大数字。然后你会找到丢失的号码。 如果有,返回数组。 如果没有,我们返回 None。

此代码不适用于所有情况,但它是一个很好的开始。

最简单的方法是对列表进行排序,然后向后循环,然后

下一个号码还有空位吗?

如果有,您可以将其添加到列表中。 如果没有,请跳过。

最后你应该检查你的 tmpList 的总和。它的总和有可能是 != 您的预期数字。

【讨论】:

以上是关于获取总和为X的数组的数字列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

问题列表

查找数组总和中的哪些数字到目标总和 [重复]

如何返回所有具有 N 总和的唯一数字组合 [重复]

如何在飞镖列表中获取重复值的总和?

递归与回溯6:LeetCode39组合总和(可重复使用)

39. 组合总和