【问题标题】:What will be the optimal algorithm to verify that there exist a sub sequence of given array whose sum is equal to a number?验证给定数组的子序列是否存在总和等于一个数字的最佳算法是什么?
【发布时间】:2014-02-06 16:33:15
【问题描述】:

我试图解决一个问题,即验证是否存在总和等于给定数字的子序列。我找到了这个线程Distinct sub sequences summing to given number in an array。 我不必为所有可能的子序列解决它,我只需要验证即可。验证它的最佳算法是什么。 例如a[]={8,1,2,5,4,7,6,3} and num=18

8+2+5+3 = 18

【问题讨论】:

标签: arrays algorithm


【解决方案1】:

您正在尝试解决已知为 NP 完全的 subset sum problem

因此没有已知的最优多项式算法。但是,如果您的问题允许某些约束,则可以使用 Wikipedia 文章中提供的一种算法优雅地解决它。

【讨论】:

  • 需要注意的是,我不需要考虑连续子数组。
  • @SatishPatel 这就是重点,如果它是连续的,它就不是 np-complete - 蛮力可以在 O(n^2) 中解决它。对于非连续的,这基本上是一个集合,问题是NP-Complete。
  • SImeonVisser - 有一个最优算法,没有已知的多项式最优算法。
  • @amit:是的,感谢您的更正(答案已更新)。
【解决方案2】:

有一个类似于背包问题的伪多项式动态规划解决方案,使用以下类比:-

  1. 背包容量 W = num
  2. 项目 i 的重量和成本与 arr[i] 相同
  3. 利润最大化
  4. 如果 MaxProfit == W 则存在子序列,否则不可能有子序列。
  5. 使用 DP 值重构解决方案

注意:因此这可以简化为背包问题,因此还没有找到多项式时间解。

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多