【问题标题】:Subsequence having sum at most 'k'子序列的总和最多为 'k'
【发布时间】:2020-05-12 13:40:02
【问题描述】:

给定一个大小为 n非递减数组 A 和一个整数 k,如何找到一个子序列S 数组 A 及其元素的 最大 可能总和,因此该总和最多为 k。如果有多个这样的子序列,我们只想找到一个。

例如,设数组为 {1, 2, 2, 4} 所以,n = 4,设 k = 7。那么,答案应该是 {1, 2, 4}。

蛮力方法大约需要 O(n(2^n-1)),但是有没有更有效的解决方案来解决这个问题?

【问题讨论】:

  • 所有元素都是正数吗?
  • @Damien 是的,元素大于零。
  • @Saibot 提供的 Wiipedia 链接给出了一个简单动态规划算法的示例。第一步,您可以尝试实现它并检查它是否足够快
  • 好的,谢谢

标签: c++ arrays algorithm dynamic-programming


【解决方案1】:

一般情况下答案是否定的。

只是决定是否存在一个解决方案,其中元素总和为 k 等价于 Subset Sum Problem,因此已经是 NP 完全的。

子集和问题可以等效地表述为:给定整数或 自然数 w_1,... ,w_n 它们的任何子集是否精确地求和 W

但是,如果 n 或表示最大数 w 所需的位数 P 很小,则可能会有更有效的解决方案(例如,基于动态规划的伪多项式解决方案,如果P 很小)。此外,如果您的所有数字 w 都是正数,那么也有可能找到更好的解决方案。

【讨论】:

  • 谢谢,是的,如果所有数字都大于零,那么可能的动态规划解决方案是什么?
  • @S13 k 不知道细节:在上面的 Wiki 页面上提到 Pisinger 找到了一个 O(N*C) 算法(其中 C 是权重的上限)来检查权重的组合总和为 k 的存在。用这种方法检查从 k 到 0 的所有数字会给你O(N*C*k)
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2013-03-05
  • 2013-08-06
  • 2020-11-11
  • 2023-03-29
  • 2020-04-15
相关资源
最近更新 更多