2014-06-12 34 views
-1

这应该是一个很简单的问题,但我没有适当的算法培训,发现自己试图解决这个问题。算法计算所有可能的子集

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

想象一下,我们正在玩乐高,我有一个12单位长的砖,我需要列出我可以用较短的砖做出的替代品。对于这个例子,我们可以说可用的砖是2,4,6和12个单位长。

什么可能是一个很好的方法来建立一个算法,可以计算取代?我一次可以使用多少块砖,没有限制,所以它可以是6x2以及1x12,重要的是我需要列出全部的选项。

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

我的做法是先从低数字开始,然后将其加起来,直到达到目标,然后再下一个最低等等。但这样我错过了多个数字的组合,当我试图将它分解时,它变得非常混乱。

+1

有什么不对这个问题,它值得向下票呢? – yizzlez

+1

也许类似于http://stackoverflow.com/questions/3420937/algorithm-to-find-which-number-in-a-list-sum-up-to-a-certain-number – Bharat

+0

@awesomeyi我只能猜测,但是...... OP给出的方法几乎正是你需要做的 - 没有代码或伪代码,我们只能猜测OP出错的地方......更不用说有很多列表了 - 全部这里有一些问题。 – Dukeling

回答

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)) 
+0

感谢您的建议。不幸的是,我不是一个Python家伙,所以即使你的例子似乎很清楚,我对“收集”做了什么感到困惑?如果你能够把它翻译成ruby,这将是非常有用的,但否则收集是我没有得到的唯一部分。 – funkylaundry

+0

我不知道Ruby;我的代码不是Python。收集意味着将该值放入累加器,并在退出函数时返回其内容。 – sds

+0

太好了,谢谢。我会看看我是否可以在Ruby中复制它。那么你写的例子是什么语言? – funkylaundry