arrays - 和大于给定值的子数组的最小和

标签 arrays algorithm performance numbers

输入:N 正数和一个值X 使得N 小于<强>X
输出:其所有数字之和等于Y > X的子数组,使得没有其他子数组其数字之和大于X> 但小于 Y

这道题有多项式解吗?如果是这样,你能介绍一下吗?

最佳答案

正如其他答案所表明的那样,这是一个 NP 完全问题,称为“Knapsack Problem”。所以没有多项式解。但是它有一个伪多项式时间算法。 This explains what pseudo polynomial is .

A visual explanation of the algorithm .

And some code .

如果这是与工作相关的(我已经多次遇到过这个问题,以各种形式出现)我建议引入额外的限制来简化它。如果这是一个一般性问题,您可能还想检查其他 NP-Complete 问题。 One such list.

编辑 1:

AliVar 提出了一个很好的观点。给定问题搜索 Y > X,而背包问题搜索 Y < X。因此,此问题的答案需要更多步骤。当我们试图找到 Y > X 的最小总和时,我们也在寻找 S <(总计 - X)的最大总和。第二部分是原始背包问题。所以;

  1. 求总数
  2. 为 S < (Total - X) 解决背包问题
  3. 从原始输入中减去背包解决方案中的项目列表。
  4. 这应该给你最小的 Y > X

关于arrays - 和大于给定值的子数组的最小和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436114/

相关文章:

java - 在 Java 中将可变长度的整数数组倒数到零

c++ - 生成给定长度的所有可能的 1 和 0 数组的算法

angularjs - 嵌套 ng-repeat 的 DOM 娱乐性能问题

performance - Spark withColumn 性能

python - 按 Fortran 连续顺序 reshape numpy.array

java - 在消息到达时显示消息,而不是在 session 结束时显示所有消息

c# - 如何判断一个值是否在 List<string> 中?

Python:在列表中添加

c# - 在 int[] 中找到最大总和范围的最快方法

PHP 性能指标