【发布时间】: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