【问题标题】:Check whether is it possible to divide array into 2 subsets of sum atleast k?检查是否可以将数组划分为总和至少 k 的 2 个子集?
【发布时间】:2021-04-09 04:09:28
【问题描述】:

给定一个大小为 n 的数组,我们必须检查是否可以将 Array 的元素分成两个子集,使得两个子集的总和至少为 k。
我该如何解决这个问题?

我的方法:

我想到了一种贪婪的方法来获取所有较大的元素直到它达到 k 并检查是否total_sum-sum>=k。但是这个逻辑是不正确的。

我认为的另一种方法是蛮力,简单地递归所有可能的子集并找出它是否满足我的条件。但它的时间复杂度是指数级的,即使在使用 DP 之后它也是O(n^2)

但是2<=n<=2*10^5.

你能帮我找到解决这个问题的最佳方法吗?

【问题讨论】:

  • “2
  • @ScottHunter,这告诉我们解算法的复杂度可能应该低于 O(n^2)
  • 子集总和 DP 的简单变体。
  • 我尝试了 DP 方法,但它在一些测试用例上提供了 TLE,所以我想知道是否有另一种方法(可能是某种贪婪)具有更低的时间复杂度,小于 O(n^2)

标签: arrays algorithm sorting optimization


【解决方案1】:

这是不可能的

如果我们将k 取为整个数组之和的一半,那么这个问题就被称为Partition problem,这是著名的NP-完全问题。对于n=2*10^5,没有任何已知算法可以始终如一地(在合理的时间内)解决任何NP-完全问题。

附:请注意,蛮力解决方案在O(2^n) 中运行,而不是O(n^2)

【讨论】:

  • 好吧,即使背包是 NP 完全的,但有一个具有伪多项式时间复杂度的动态规划算法。 NP完全≠不存在算法。
  • @abc 实际上,分区也是伪多项式。但是,输入的值没有给出界限,只有大小,所以我认为我的观点是正确的。我当然从未声称没有算法可以解决 NP 完全问题。
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2016-01-09
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多