Suppose I have a list of three products (A, B C). Each Product has a price. Given a total cost, I want to find all the possible product combinations to equal exactly that co
The itertools module offers combinatoric generators to help with problems such as this:
>>> from itertools import *
>>> prices = dict(a=10, b=15, c=8, d=2, e=5)
>>> total_cost = 20
>>> for r in range(1, 30):
for t in combinations_with_replacement(prices, r):
cost = sum(prices[p] for p in t)
if cost == total_cost:
print t
def possibilities(available_products, target_price):
if target_price == 0 or not available_products:
return []
this_price = available_products[0]
remaining_products = available_products[1:]
results = []
for qty in range(1 + target_price / this_price):
remaining_price = target_price - qty*this_price
if remaining_price == 0:
results.append([qty] + [0] * len(remaining_products))
else:
for option in possibilities(remaining_products, remaining_price):
results.append([qty] + option)
return results
That gives you:
pprint.pprint(possibilities([1, 2, 5], 10))
[[0, 0, 2],
[0, 5, 0],
[1, 2, 1],
[2, 4, 0],
[3, 1, 1],
[4, 3, 0],
[5, 0, 1],
[6, 2, 0],
[8, 1, 0],
[10, 0, 0]]