整数和的算法

时间:2012-05-16 07:31:22

标签: c# algorithm math

  

可能重复:
  Finding all possible combinations of numbers to reach a given sum

我必须创建一个方法,从数组中选择数字,其总和将是必需的,或者如果不存在则选择最小的更大的数字。 这个函数的算法是什么?

public int[] selectExactSum(int[] X, int SUM) {
}

例如: 数字为:{5,2,8,4,6},所需金额为12。

结果将是:{2,4,6}

如果要求总和为13,结果将是:{2,8,4} - 所以,总和将在这种情况下为14 - 第一个最小值更大。

如果要求总和为15,则可能的结果为:{5,2,8}或{5,4,6}。在这种情况下,请返回您选择的一个 - 可能是您获得的第一个。

自定义数字和求和的算法是什么?

谢谢, 西蒙

3 个答案:

答案 0 :(得分:6)

这是一个名为subset sum的问题的概括案例。这是一个NP完全问题,因此最着名的算法是pseudo-polynomial。 如果您了解上述链接算法,则可以扣除解决问题所需的修改。

答案 1 :(得分:1)

递归怎么样?

public static int[] SelectExactSum(int[] x, int sum) {
  int[]
    rest = x.Skip(1).ToArray(),
    with = x.Length == 1 ? x : x.Take(1).Concat(SelectExactSum(rest, sum - x[0])).ToArray(),
    without = x.Length == 1 ? new int[0] : SelectExactSum(rest, sum);
  int withSum = with.Sum(), withoutSum = without.Sum();
  return
    withSum >= sum ? (withoutSum >= sum ? (withSum < withoutSum ? with : without) : with) :
    withoutSum >= sum ? without : new int[0];
}

注意:如问题所述,致电SelectExactSum(new int[] {5,2,8,4,6}, 13)不会返回{2,8,4},但{5,8}实际上总计为13。

答案 2 :(得分:0)

我花了大约15分钟才完成它,你可以看到它在这里运行:

http://jesuso.net/projects/selectExactSum/index.php?numbers=5%2C2%2C8%2C4%2C6&reqSum=15

这是代码:

http://jesuso.net/projects/selectExactSum/selectExactSum.txt

我尽可能简单,但它是用PHP制作的,如果你需要一些帮助将它翻译成c#,请告诉我。