C#算法 - 列出所有数字排列

时间:2009-12-21 21:37:36

标签: c# algorithm

这是我之前发布的问题(C# algorithm - find least number of objects necessary)的后续问题,但有点不同。

鉴于我有以下代码:

var max = 80;
var list = new[]{10,20,30,40,50, 60);

我想生成一个包含所有可能组合的数组,我可以使用列表中的这些数字来获得该最大数字。

数组将包含{40,40},{50,30},{40,30,10}等...

2 个答案:

答案 0 :(得分:3)

您希望按降序迭代所有数字。然后递归添加序列中的每个下一个降序数字。每次总和匹配时,请注意组合,弹出,然后继续。当你的暂定总和超过max变量时,弹出函数到堆栈中的下一个函数。如果仍未达到最大值,则在序列中连续添加下一个数字。通过这种方式,您将覆盖任何可能的序列,没有重复(除非给定集中有重复,在这种情况下,您希望重复)。实际上代码不会太多。

答案 1 :(得分:2)

天真的方法是简单地生成每种可能的数字组合,并查看它们是否与目标数字相加。

毋庸置疑,这有可怕的时间复杂性。但它确实适用于小型清单。

编辑:实际上,如果你允许重复的数字,这不起作用。另一种算法(允许重复,但不允许任何否定)基本上是在列表中添加最高数字,然后在超过目标时回溯。