【问题标题】:Algorithm for sum of integers [duplicate]整数和的算法[重复]
【发布时间】:2012-05-23 17:49:50
【问题描述】:

可能重复:
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}。在这种情况下,返回您选择的一个 - 可能是您得到的第一个。

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

谢谢, 西蒙

【问题讨论】:

  • 你认为@Simonxy 的方法是什么。你想到什么了吗?
  • 家庭作业?如果是,请添加标签homework
  • 在 sum=12 的示例中,有几种解决方案(2,4,6 也有 8,4)。应该全部找到吗?否则,这两种解决方案是等效的还是一种优于另一种?
  • 有趣的问题。不明白为什么它是实用的,但不妨使用它
  • 为什么要求的 sum 13 不返回 {5, 2, 6} 而实际上是 13?

标签: c# algorithm math


【解决方案1】:

这是问题的一般化案例subset sum。这是一个 NP 完全问题,因此最著名的算法是 pseudo-polynomial。 如果你理解上面的链接算法,你可以扣除解决你的问题所需的修改。

【讨论】:

  • 你有例子吗?谢谢。
【解决方案2】:

递归怎么样?

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。

【讨论】:

  • 通过这种方式你可以杀死内存:int[] rest = ..., with = ..., without = ... 和递归调用。
  • @SaeedAmiri:性能比记忆更早成为问题。对于具有 20 个值的数组,最大内存使用量约为 2 kb。
【解决方案3】:

我花了大约 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#,请告诉我。

【讨论】:

  • 注意*:它只是为了让您采用多种方法之一,当然有“更好”的方法来解决这个问题,您仍然需要添加错误处理和类似的东西那个,但我有点喜欢最后测试它,你可以使用类似的东西:jesuso.net/projects/selectExactSum/… 它仍然有效:D 所以你可以对任何数字求和,只要你有 1 对和 1 个奇数,或者只有 1 成给定的数字。
  • 您可以在 ideone.com 上发布您的代码
  • 当我阅读您的代码(我不是 php)时,我不确定它是否有效。你能用 JavaScript 或 C# 解释一下吗?
  • 这个答案链接的站点已经消失,将相关代码粘贴到这个答案中会更有用。是的,c#(或 python,或 ruby​​ ..)版本对许多人来说非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2015-03-04
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多