子集和問題

2021-08-21 06:49:15 字數 909 閱讀 2155

子集和問題

給定乙個整數集,是否存在子集使和為0

例:[-7,-3,2,5,8]中存在[-7,2,5]和為0

暴力解法,求出所有的子集,判斷是否為0

子集的個數:因為每乙個元素要麼出現要麼不出現,所有一共有2^n個

先假設a中只有三個元素,元素出現用1表示不出現用0表示

所有子集為[100], [010], [001], [110], [101], [011], [111], [000],每個子集也可用十進位制表示

同理,可以 10進製轉換為2進製,再找到相對應的子集

**實現

def

subset_sum

(lst, target):

for i in range(1, 2**len(lst)):

pick = list(mask(lst, bin(i)[2:]))# 找到所有子集

if sum(pick) == target:

yield pick

defmask

(lst, m):

''' 取得lst中對應位置的元素 '''

m = m.zfill(len(lst))# 增加長度,不夠補0

res =

for i in range(len(lst)):

if m[i] != '0':

return res

# 高階寫法

# return map(lambda x: x[0], filter(lambda x: x[1] != '0', zip(lst, m)))

result = subset_sum([1, 2, 3], 5)

for i in result:

print(i)

時間複雜度o(2^n),指數級,當n>1000時,單位為年

子集和問題

題目描述 子集和問題的乙個例項為 s,t 其中,s 是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得s1中的各元素之和等於c。題目出自 計算機演算法設計與分析 第3版 王曉東 思路 用回溯法解這道題,我本來想修改排列樹使之可以求出乙個集合的所有子集。但是分析了一下,時...

子集和問題

問題描述 子集和問題的乙個實力為。其中,s 是乙個正整數的集合,c是乙個正整數。判定是否存在s的乙個子集s1使得s1的和為c。輸入 輸入含多組測試用例!對每組測試用例,第一行有兩個正整數n和c,n表示s的大小,c是子集和的目標值。接下來的一行,有n個正整數 1 n 10000 表示集合s中的元素。當...

子集和問題

今天程式考試受挫,遂打算寒假空閒時間刷刷題,練練手感。今天有一題是這樣的,檔案 data.txt 有n 1行,每一行都為乙個正整數,第一行為n,剩餘n行為任意n個正整數。對於正整數m m 2 輸出m個數的和,要求和不大於100,並列出表示式 並且要求表示式不相同。若表示式中的元素相同則表示式就相同,...