[英]Algorithm to find a list of numbers that sum up to a certain number
我正在学习 python 并且我对此任务有疑问
我有一个数字列表 0<=n<=(end),我想找到具有 6 个元素的列表的所有组合,这些元素的元素总和为某个数字 S
我将使用 function 创建的列表来检查一些我认为是另一种任务的条件。 现在,我正在寻找一种有效的方法来完成上述任务,我尝试使用蛮力,但我想时间复杂度呈指数级增长!
伪代码或已知算法的建议对我来说也很好,我只是一条建议。 谢谢你。
例如,
def f(end, S):
#definition of the function
input f(14, 14)
output [14, 0, 0, 0, 0, 0] [0, 14, 0, 0, 0, 0] ...(and so on)... [0, 0, 3, 0, 7, 4] [0, 0, 3, 0, 6, 5] (and so on)...
以下是关于我上面提到的情况的信息,我的主要问题仍然是关于上面的任务! 所以你可以忽略下面的部分
我有三个不同的函数返回一个字符串(唯一可能的输出是 A、B、C 或(无)。例如)f1(list) --> 'A' f2(list) --> 'B' f3(list ) --> 'C'
我将把我要求的function创建的列表放到那些函数中,找出哪些情况下列表导致三个函数返回一个彼此不同的String,而它们都不返回(无)(f1,f2,f3应返回 A 或 B 或 C)。 我会为每个列表做一个循环,并找出其中哪些满足这个条件。
Python 有一个非常快速和有用的广泛的标准库。 在这种情况下, itertools 的 combinations_with_replacement可以解决问题。
您只需要选择总和为N
的组合
例如,这段代码
import itertools as it
N = 14
SIZE = 6
lst = range(N+1)
sum_n_combs = [
comb for comb in it.combinations_with_replacement(lst, SIZE)
if sum(comb) == N
]
print(sum_n_combs)
产生
[(0, 0, 0, 0, 0, 14), (0, 0, 0, 0, 1, 13), (0, 0, 0, 0, 2, 12), (0, 0, 0, 0, 3, 11), (0, 0, 0, 0, 4, 10), (0, 0, 0, 0, 5, 9), (0, 0, 0, 0, 6, 8), (0, 0, 0, 0, 7, 7), (0, 0, 0, 1, 1, 12), (0, 0, 0, 1, 2, 11), (0, 0, 0, 1, 3, 10), (0, 0, 0, 1, 4, 9), (0, 0, 0, 1, 5, 8), (0, 0, 0, 1, 6, 7), (0, 0, 0, 2, 2, 10), (0, 0, 0, 2, 3, 9), (0, 0, 0, 2, 4, 8), (0, 0, 0, 2, 5, 7), (0, 0, 0, 2, 6, 6), (0, 0, 0, 3, 3, 8), (0, 0, 0, 3, 4, 7), (0, 0, 0, 3, 5, 6), (0, 0, 0, 4, 4, 6), (0, 0, 0, 4, 5, 5), (0, 0, 1, 1, 1, 11), (0, 0, 1, 1, 2, 10), (0, 0, 1, 1, 3, 9), (0, 0, 1, 1, 4, 8), (0, 0, 1, 1, 5, 7), (0, 0, 1, 1, 6, 6), (0, 0, 1, 2, 2, 9), (0, 0, 1, 2, 3, 8), (0, 0, 1, 2, 4, 7), (0, 0, 1, 2, 5, 6), (0, 0, 1, 3, 3, 7), (0, 0, 1, 3, 4, 6), (0, 0, 1, 3, 5, 5), (0, 0, 1, 4, 4, 5), (0, 0, 2, 2, 2, 8), (0, 0, 2, 2, 3, 7), (0, 0, 2, 2, 4, 6), (0, 0, 2, 2, 5, 5), (0, 0, 2, 3, 3, 6), (0, 0, 2, 3, 4, 5), (0, 0, 2, 4, 4, 4), (0, 0, 3, 3, 3, 5), (0, 0, 3, 3, 4, 4), (0, 1, 1, 1, 1, 10), (0, 1, 1, 1, 2, 9), (0, 1, 1, 1, 3, 8), (0, 1, 1, 1, 4, 7), (0, 1, 1, 1, 5, 6), (0, 1, 1, 2, 2, 8), (0, 1, 1, 2, 3, 7), (0, 1, 1, 2, 4, 6), (0, 1, 1, 2, 5, 5), (0, 1, 1, 3, 3, 6), (0, 1, 1, 3, 4, 5), (0, 1, 1, 4, 4, 4), (0, 1, 2, 2, 2, 7), (0, 1, 2, 2, 3, 6), (0, 1, 2, 2, 4, 5), (0, 1, 2, 3, 3, 5), (0, 1, 2, 3, 4, 4), (0, 1, 3, 3, 3, 4), (0, 2, 2, 2, 2, 6), (0, 2, 2, 2, 3, 5), (0, 2, 2, 2, 4, 4), (0, 2, 2, 3, 3, 4), (0, 2, 3, 3, 3, 3), (1, 1, 1, 1, 1, 9), (1, 1, 1, 1, 2, 8), (1, 1, 1, 1, 3, 7), (1, 1, 1, 1, 4, 6), (1, 1, 1, 1, 5, 5), (1, 1, 1, 2, 2, 7), (1, 1, 1, 2, 3, 6), (1, 1, 1, 2, 4, 5), (1, 1, 1, 3, 3, 5), (1, 1, 1, 3, 4, 4), (1, 1, 2, 2, 2, 6), (1, 1, 2, 2, 3, 5), (1, 1, 2, 2, 4, 4), (1, 1, 2, 3, 3, 4), (1, 1, 3, 3, 3, 3), (1, 2, 2, 2, 2, 5), (1, 2, 2, 2, 3, 4), (1, 2, 2, 3, 3, 3), (2, 2, 2, 2, 2, 4), (2, 2, 2, 2, 3, 3)]
你可以做 -
def f(Num, List):
n = Num
l = List
for i in range(len(List)):
if len(List) > 0 and len(List) != 1:
x= List.pop(0)
y= List.pop(0)
if x + y == Num:
print(str(x) + " and " + str(y) + " are a sum of " + str(Num))
else:
# print("the list has no more values")
exit(0)
f(10, [5, 5, 8, 2, 3, 4, 3]) # 3, 4, 3 will not be checked
3,4,3 不会被检查的原因是因为程序不支持超过 2 个数字的总和,想象一下如果你给这个列表 [4, 4, 2] 并想找到 10 作为它的总和,程序不会做任何事情,只是退出,因为它不支持 3 个或更多数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.