【问题标题】:Subset Sum : Find subset whose sum greater than KSubset Sum : 查找总和大于 K 的子集
【发布时间】:2013-08-08 11:55:48
【问题描述】:

我有一个正整数数组 {a1, a2, ...., an},我想找出满足以下条件的数组的所有可能子集:

(sum >= K)

其中 K 是一个正整数。我知道这个问题的解决方案是动态编程,但无法思考如何在这种情况下使用它。请帮忙。

附: :我并不完全需要所有子集,而是说所有元素的乘积形成所有子集。

【问题讨论】:

  • 您需要枚举所有子集还是只计算它们?
  • @SergeyWeiss 我需要从另一个相应的数组(数组 B 的相应索引处的数字)相乘然后相加

标签: dynamic-programming subset-sum


【解决方案1】:

你的问题看起来类似于 0-1 背包问题,除了事情 - 通常这个限制是,总和 必须小于 小于 K。

但你列出了问题,限制在哪里,总和必须更大

因此,例如,如果您找到子集,它的总和大于 K,那么您可以添加任何未包含在子集中的集合元素,这仍然是答案。假设,您的集合是 {a1, a2, a3, a4} 和 {a1} >= K。然后,您有 2^3 种方法可以将 a2、a3 和 a4 添加到您的子集中。

所以,这个问题看起来像指数问题,因为您需要列出所有可能的变化。

最坏的情况是,当 K = 0 时。并且您有 N 个大于 0 的元素。因此,您需要列出 2 ^ N 个子集。

这个链接可能对http://en.wikipedia.org/wiki/Subset_sum_problem有帮助

【讨论】:

  • 我已经尝试过指数方式,它并没有解决我的问题。寻找某种动态编程方法!
  • 动态编程无法解决列出所有可能子集的问题。正如我提到的,在最坏的情况下,您需要列出 2^N 个子集。而且没有办法比指数方式更快地做到这一点
  • 我不想枚举它们,而是对这些元素执行一个集体操作,只是说添加这些元素的所有索引
猜你喜欢
  • 1970-01-01
  • 2012-02-13
  • 2021-06-04
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
相关资源
最近更新 更多