可能重复:
Finding all possible combinations of numbers to reach a given sum
我不想使用Itertools因为它以我不想要的顺序输出内容而无法使用(我需要能够评估组合生成器尝试输出的内容以决定我是否要继续沿着那个分支去。)
例如,假设我有一个列表[1,2,3,4,5],我希望输出具有完整产品< = 12且没有浪费迭代的组合。如果我生成,例如,[1,2,3],这很好,因为1 * 2 * 3 = 6。但如果我尝试[1,2,3,4]然后1 * 2 * 3 * 4 = 24,这大于12,因此我甚至不应该费心去研究[1,2,3,5]或[1,2,4,5]等。
目前的尝试:
from operator import mul
mylist=[1,2,3,4,5]
limit=12
def productOK(mylist): #but this can be any conditional, theoretically
if reduce(mul, mylist) > limit:
return False
return True
def generateValidSubsets(mylist):
for r in range(1,len(mylist)+1):
start=mylist[:r]
if productOK(start)==False: break
#not sure how to recombine in the right order otherwise
yield start
for combo in generateValidSubsets(mylist):
print combo
我哪里错了?
答案 0 :(得分:0)
我强烈建议您切换到递归实现。这样您就可以更轻松地实现切割:
def subs(target, universe, currentsubs, currentproduct, goodsubs):
first_from_universe_not_in_currentsubs = # an exercise for the reader
newsubs = [first_from_universe_not_in_currentsubs] + currentsubs
newproduct = currentproduct * first_from_universe_not_in_currentsubs
if newproduct == target:
return goodsubs + [newsubs]
elif newproduct > target:
return goodsubs
else:
return subs(target, universe, newsubs, newproduct, goodsubs)
subs(12, [1,2,3,4,5], [], 0, [])
即使您填写上面的空白,也可能不太正确,但它确实向您展示了如何实现切割。