[英]Subset sum with `itertools.combinations`
我在python中有一個整數列表,讓我們說:
weight = [7, 5, 3, 2, 9, 1]
我應該如何使用itertools.combinations來查找這些整數的所有可能的和子集。 所以我得到了(3個整數所需輸出的例子 - weight = [7,5,3]:
sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ]
與這些權重相關聯我有另一個名為luggages的數組,它是一個列表列表,其中包含行李名稱及其相應的權重,格式如下:
luggages = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....]
我以這種方式創建了一個名為weight的數組。
weight = numpy.array([c[1] for c in luggages])
我可以為行李名稱做到這一點。 我嘗試以這種方式使用itertools.combinations(根據建議):
comb = [combinations(weight, i) for i in range(len(luggages))]
我的目標:打印出行李名稱的所有可能子集,我可以帶上行程,因為max_weight = 23
kg的每個子集的所有組合滿足子集總和等於23 KG的條件。 簡單來說,我必須打印出一個帶有行李名稱的列表,如果它的權重相加則等於max_weight = 23
。 請記住:行李只能在每個子集中選擇一次,但它們可以出現在盡可能多的子集中。 此外,每個子集中的項目數量是無關緊要的:它可以是1個行李,2,3個......只要它們的總和恰好等於23。
在旅行推銷員工作,是嗎? 您可以使用每個人最喜歡的Python功能,列表推導來執行此操作:
weight = [7, 5, 3, 2, 9, 1]
cmb = []
for x in range(1, len(weight) + 1):
cmb += itertools.combinations(weight, x)
#cmb now contains all combos, filter out ones over the limit
limit = 23
valid_combos = [i for i in cmb if sum(i) == limit]
print(valid_combos)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.