【问题标题】:Does a combination of K integers exist, so that their sum is equal to a given number?是否存在 K 个整数的组合,使得它们的和等于给定的数字?
【发布时间】:2012-01-22 15:59:48
【问题描述】:

我被要求回答这个问题(从技术上讲是家庭作业)让我大汗淋漓。 我考虑过使用哈希表,但我对如何完成这项工作的具体细节有点坚持

问题来了:

给定k组整数A1,A2,。 .,Ak个总大小为O(n),你要判断是否存在 a1 ϵ A1, a2 ϵ A2,..,ak ϵ Ak,这样 a1+a2 +..+ak-1 =ak。您的算法应该在 Tk(n) 中运行 时间,其中 Tk(n) = O(nk/2 × log n) 偶数 k 和 O(n(k em>+1)/2) 表示 k 的奇数值。

谁能给我一个大致的方向,以便我可以更接近解决这个问题?

【问题讨论】:

  • 恭喜你获得作业。你对这个问题有任何的答案吗(不考虑复杂性)?如果是这样,您如何分析它的复杂性?你认为你的方法是完全错误的,还是你认为某些特定的部分是错误的?
  • 我能想到的唯一能 100% 工作的是 n^n 的最天真的实现(即检查所有选项)。显然这不是正确的方法:(
  • 我想知道这是否更适合 Math Overflow?

标签: algorithm hashtable backtracking subset-sum


【解决方案1】:

将 k 个集合分成两组。对于偶数 k,两组各有 k/2 组。对于奇数 k,一组有 (k+1)/2 组,另一组有 (k-1)/2 组。计算每组中所有可能的总和(从每组中取一个元素)。对于偶数 k,您将得到两个数组,每个数组都有 nk/2 个元素。对于奇数 k,一个数组有 n(k+1)/2 元素,另一个数组有 n(k-1)/2 个元素。问题归结为标准问题“给定两个数组,检查是否可以通过从每个数组中取一个元素来达到指定的总和”。

【讨论】:

  • 感谢您的回答!这在直觉上似乎是正确的,但我无法完全弄清楚这实际上是如何减少问题的。你能详细说明一下吗?
  • 给定两个大小为 O(n) 的数组,您可以找出 O(n*log n) 中是否存在总和。解决方案不是太难。如果我把它给你,我会感到内疚,因为你提到这是一个家庭作业!
  • @viswanathgs:你甚至可以平均在 O(n) 时间内解决两个数组问题。
  • @unforgiven:那只是在数组被排序的情况下,对吧?还是有什么我没看的?
猜你喜欢
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2020-06-30
相关资源
最近更新 更多