【问题标题】:Specific knapsack-like特定的背包状
【发布时间】:2015-02-25 15:02:57
【问题描述】:

我正在寻找一些想法来处理这个特定的背包问题(我相信这是类似背包的问题,​​尽管我可能会弄错)。

作为输入,我们得到一组数字,每个数字都可以是正数或负数 - 我们不知道。 我们必须找到这些数字之和的最小可能绝对。 我们不必使用所有数字。我们必须按照给定数字的相同顺序进行加法(或减法),并且我们必须从第一个数字开始(然后加上或减去后面的数字)。

例如:

4 11 5 5 => 0
because 4+11-5-5 = 0

10 3 9 4 100 => 2
because 10-3-9 = -2

在第二个示例中,我们跳过了最后两个数字 - 因为添加下一个数字不会得到更小的绝对数字。

数字数量最多可达 5,000 ,并且它们的总和不会超过10,000

它们是整数

【问题讨论】:

  • 是否给出了数字的范围?它们是整数吗?
  • 珍妮是的。这些数字的总和不会超过 10,000,是的,它们是整数(但当然只是正数)。很抱歉我没有在帖子中提到这一点。
  • 我建议学习the dynamic programming solution to the subset sum problem。这个问题略有不同,但解决方案背后的想法适用。
  • 我们是否总是想使用序列的前缀,或者我们可以跳过一些数字并使用子序列?在前一种情况下,这确实是背包问题的一种变体:假设对于长度为 k 的前缀,您首先将所有值都设为负数(因此基数和为 -a1 + -a2 + ... + -ak),然后可能将一些负号转换为正号(从-ai 转换为+ai 将重量为2*ai 的对象添加到背包中)。在后一种情况下,我们得到第三个选项来跳过一个对象,从而将1*ai 添加到背包中。
  • 两个例子都不正确:4+11-5-5=5,而4-11+5=-2最好,第二个最好是10+3-9-4 =0

标签: algorithm knapsack-problem


【解决方案1】:

如果您要探索 5000 个数字的所有加减法组合,您将不得不经历 25000−1 ≈ 1.4⋅101505 个备选方案。这显然不合理。但是,由于数字的总和最多为 10000,我们知道所有部分和(包括减法)必须在 -10000 和 10000 之间,因此可以有少于 20000 个不同的和。如果您在处理 5000 个职位时只考虑不同的总和,那么您需要考虑的总和不到 1 亿个,这对于计算机来说并不是那么多工作。


示例:假设前三个数字是 5,1,1。恰好包含三个数字的可能总和是
5+1+1=7
5+1-1=5
5-1+1=5
5-1-1=3

在添加第四个数字之前,重要的是要认识到您从四个计算中只有三个唯一的结果。

【讨论】:

  • 我不太明白。你能详细说明一下吗?我如何只考虑不同的总和?
  • 这是个好主意,但还是太慢了。规则的一点变化——现在我只对所有数字总和的最低值感兴趣,但这并没有太大的区别。 ideone.com/0KnSBa这是我的实现,我希望我的算法清晰易懂。输出是 100% 正确的(这是官方测试)。我乘以相同的测试以获得可测量的执行时间。算法在那里很重要,你可以忽略 i/o 的东西。
  • 我的代码风格不太好,所以也许我会描述我的实现:1.我从第一个数字开始,作为唯一可能的当前总和 2.我选择下一个数字,我考虑两种可能性(加法或减法),然后将结果添加到 set 3. 然后我使用这组可能的总和来添加/减去另一个数字。因为它的 set 我会避免重复。
  • 好吧,我成功了。我使用了总和只能介于 -10000 和 10000 之间的事实,所以我用基于索引的(我创建了 20k 大元素表)替换了 set,以记住以前的总和,它尽可能快。我仍然有 0.10 的执行时间,最好的解决方案有 0.00
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多