我正在學習 python,但我對這個任務有疑問
我有一個數字串列 0<=n<=(end),我想找到包含 6 個元素的串列的所有組合,這些元素的元素總和為某個數字 S
我將使用該函式創建的串列來檢查一些我認為是另一種任務的條件。現在,我正在尋找一種有效的方法來完成上述任務!我嘗試使用蠻力,但我猜時間復雜度是指數級的!
已知演算法的偽代碼或建議對我來說也很好!我只是一個建議,謝謝。
例如,
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'
我會將我請求的函式創建的串列放入這些函式中,并找出哪些串列情況導致三個函式回傳彼此不同的字串,而它們都不回傳 (none)(f1, f2, f3應回傳 A 或 B 或 C)。我將為每個串列創建一個回圈,并找出其中哪些滿足此條件。
uj5u.com熱心網友回復:
Python 有一個擴展的標準庫,它非常快速且有用。在這種情況下,itertools 的 combination_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)]
uj5u.com熱心網友回復:
你可以做 -
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 個或更多的數字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430311.html
