计算所有可能子集的算法

时间:2014-06-12 01:40:58

标签: algorithm

这应该是一个非常简单的问题,但是我没有适当的算法训练,发现自己一直试图解决这个问题。

我需要通过添加一组有限的较小数字来计算可能的组合以达到数字。

想象一下,我们正在玩乐高积木,我有一块12个单位的砖,我需要列出我可以使用更短的砖块进行的替换。对于这个例子,我们可以说可用的砖块长2,4,6和12个单位。

构建可以计算变量的算法可能是一个好方法吗?我一次可以使用多少砖块没有界限,所以它可以是6x2以及1x12,重要的是我需要列出所有选项。

因此输入是目标长度(在这种情况下为12)和可用砖块(数字数组(任意长度),在本例中为[2,4,6,12])。

我的方法是从较低的数字开始并将其加起来直到我达到目标,然后采取下一个最低等等。但是这样我错过了多个数字的组合,当我试图将其考虑在内时,它变得非常混乱。

1 个答案:

答案 0 :(得分:1)

我建议采用递归方法:给定函数f(target,permissibles)target的所有表示形式列出permissibles的组合,您可以这样做:

def f(target,permissibles):
  for x in permissibles:
    collect f(target - x, permissibles)

如果您不想区分12 = 4+4+2+212=2+4+2+4,则需要按降序排序permissibles并执行

def f(target,permissibles):
  for x in permissibles:
    collect f(target - x, permissibles.remove(larger than x))