簡體   English   中英

與`itertools.combinations`的子集和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM