これらの組み合わせを生成するためのPythonのツールはありますか:
a=200
b=100
limit=500
組み合わせは次のとおりです。
200,200,100 sum(200+200+100)<=500
200,100,100,100 sum(200,100,100,100)<=500
これらの組み合わせを生成するためのPythonのツールはありますか:
a=200
b=100
limit=500
組み合わせは次のとおりです。
200,200,100 sum(200+200+100)<=500
200,100,100,100 sum(200,100,100,100)<=500
>>> from itertools import product
>>> a = 200
>>> b = 100
>>> [x for i in range(1, limit/min((a,b))+1) # Py 2 use xrange for more efficiency
for x in product((a,b), repeat=i)
if sum(x) <= limit]
[(200,), (100,), (200, 200), (200, 100), (100, 200), (100, 100), (200, 200, 100),
(200, 100, 200), (200, 100, 100), (100, 200, 200), (100, 200, 100),
(100, 100, 200), (100, 100, 100), (200, 100, 100, 100), (100, 200, 100, 100),
(100, 100, 200, 100), (100, 100, 100, 200), (100, 100, 100, 100),
(100, 100, 100, 100, 100)]
関数形式は次のとおりです。
>>> def combos(nums,limit):
return [x for i in range(1, limit/min(nums)+1)
for x in product(nums,repeat=i)
if sum(x) <= limit]
>>> combos(nums=(200,300,400),limit=700)
[(200,), (300,), (400,), (200, 200), (200, 300), (200, 400), (300, 200),
(300, 300), (300, 400), (400, 200), (400, 300), (200, 200, 200),
(200, 200, 300), (200, 300, 200), (300, 200, 200)]
注: このソリューションは、可能なすべての組み合わせを生成し、短い組み合わせが制限を超えた場合でも、より長い組み合わせを生成し続けるため、完全には最適化されていません。