获取总和为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的数组的数字列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章