我正在做一個專案,無論子集大小如何,都需要在 Python 中獲得獨特的組合。
假設我有一個大小串列[1,2,2,3,4,5]
和 8 的大小界限。我想要包含所有元素且不重復的組合,這樣每個組合的總和應小于或等于 8。另一個限制是減去總和和界限應該是最小的。
例如,在這種情況下,答案應該是[5,3] [4,2,2] [3,1]
這樣,8 中的總浪費將是 4,即 (3 1)-8=4。
uj5u.com熱心網友回復:
您可以使用遞回函式來“強力”打包組合并從中獲得最佳擬合:
def pack(sizes,bound,subset=[]):
if not sizes: # all sizes used
yield [subset] # return current subset
return
if sizes and not subset: # start new subset
i,m = max(enumerate(sizes),key=lambda s:s[1])
subset = [m] # using largest size
sizes = sizes[:i] sizes[i 1:] # (to avoid repeats)
used = sum(subset)
for i,size in enumerate(sizes): # add to current subset
if subset and size>subset[-1]: # non-increasing order
continue # (to avoid repeats)
if used size <= bound:
yield from pack(sizes[:i] sizes[i 1:],bound,subset [size])
if sizes:
for p in pack(sizes,bound): # add more subsets
yield [subset,*p]
def bestFit(sizes,bound):
packs = pack(sizes,bound)
return min(packs,key = lambda p : bound*len(p)-sum(sizes))
輸出:
for p in pack([1,2,3,4,5],8):
print(p,8*len(p)-sum(map(sum,p)))
[[5, 1], [4], [3, 2]] 9
[[5, 2, 1], [4, 3]] 1
[[5, 2], [4, 3, 1]] 1
[[5, 2], [4], [3, 1]] 9
[[5, 3], [4, 2, 1]] 1
[[5, 3], [4], [2, 1]] 9
[[5], [4, 1], [3, 2]] 9
[[5], [4, 2], [3, 1]] 9
[[5], [4, 3], [2, 1]] 9
[[5], [4], [3, 2, 1]] 9
[[5], [4], [3], [2, 1]] 17
print(*bestFit([1,2,3,4,5],8))
# [5, 2, 1] [4, 3]
print(*bestFit([1,2,3,4,5,6,7,8,9],18))
# [9, 1] [8, 4, 3, 2] [7, 6, 5]
隨著您的尺寸串列變大,這將花費成倍的更長的時間,但如果您只有非常小的輸入,這可能就足夠了
uj5u.com熱心網友回復:
您可能需要類似的東西itertools.combinations
,它將為您提供給定長度的子串列中所有可能的元素組合,而不會出現重復元素。
如果您想了解更多有關功能的資訊combinations
,我建議您也閱讀一下this
。
像這樣的東西應該作業:
for i in range(8//min(myList)):
for j in itertools.permutations(myList, i):
if sum(j) == 8:
print(j)
這樣,您將獲得 的所有組合myList
,并列印元素總和為 8 的那些組合。
像這樣的函式可能很有用:
def permutationsWithSum(myList: list[int], n: int):
for i in range(n//min(myList)):
for j in itertools.permutations(myList, i):
if sum(j) == n:
yield j
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/424833.html
上一篇:梯度下降擴展函式示例