子集和問題
給定乙個整數集,是否存在子集使和為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,並列出表示式 並且要求表示式不相同。若表示式中的元素相同則表示式就相同,...