Python 如何获得产品价格的每种可能组合的列表,以达到目标成本?

Python 如何获得产品价格的每种可能组合的列表,以达到目标成本?,python,algorithm,recursion,iteration,Python,Algorithm,Recursion,Iteration,假设我有一个包含三种产品(a、B和C)的列表。每种产品都有价格。给定总成本,我想找到所有可能的产品组合,使其完全等于该成本 到目前为止,我已经尝试过以下方法: for price in product: ret = [] for i in range(int(totalCost / price), -1, -1): ret.append(i) for c in range(1, len(products)+1, 1): re

假设我有一个包含三种产品(a、B和C)的列表。每种产品都有价格。给定总成本,我想找到所有可能的产品组合,使其完全等于该成本

到目前为止,我已经尝试过以下方法:

for price in product:
    ret = []
    for i in range(int(totalCost / price), -1, -1):
        ret.append(i)
        for c in range(1, len(products)+1, 1):
            ret.append(int(products[c-1][1]/products[c][1]))
这就是我被卡住的地方。这将为我提供一个可能性列表,但它只包括列表中较晚(比当前位置)的产品。它不会包含开头,因此,给我所有的可能性

我需要做些什么才能获得每一种可能性?

itertools模块提供组合生成器来帮助解决以下问题:

>>> 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
这给了你:

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]]

您的
产品
产品
列表是什么样子的?我不确定我是否正确理解你的目标。假设
A=1
B=2
C=3
。给定
totalCost=3
,您希望得到
[[A,B],[C]]
?如果将
total\u cost
更改为40,则
循环的
将无法提供所有可能性。只需扫描更多组合。用户需要设置一个合理的限制,这样运行时就不会因为一些不重要的问题而爆炸。如果将其设置为51,则运行良好。出于我的目的,我只需要将所有成本更改为十进制对象。谢谢@RaymondHettinger,它运行得很好,您向我学习了一个新模块。
51的“运行得很好”
?对于
3、[1,2,3]
情况,此解决方案(51)运行时间超过66秒,而我的解决方案运行时间为5毫秒。对于
4,[1,2,3,4]
而言,与我的10ms时相比,这需要超过16分钟。通过retracile的递归解决方案在算法上是一种优越的解决方案,并且具有良好的可扩展性。itertools版本使用无需任何删减的穷举搜索,因此它使计算机可以做更多的工作。itertools版本的优点是,开发只花了不到一分钟的程序员时间,它第一次工作,而且很容易看出它是正确的。我甚至没有为它编写脚本——交互式提示对于这么简单的问题已经足够了。我可能应该在初始的
if
之后使用
assert min(available\u products)>0和target\u price>=0
来捕获无效的输入。我确信这非常有效,但我也需要它来处理浮动。我没能不提那件事。不管怎样,谢谢。如果您为
可用产品
传递一个小数数组,为
目标价格
传递一个小数数组,它就可以正常工作了。
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]]