基本上,给定一个正的非零数字的排序列表,比如{1,4,5},更改列表中的单个数字以最大化可能的不同组合。以上给出 1,4,5,6,9,10,即六种组合。如果我们要改变4到2,那么我们有{1,2,5},我们得到1,2,3,5,6,7,8,即七种组合。
我需要找到一个数字x来添加到列表的单个数字,以最大化组合的数量。 x应该是最小的绝对值,我们可以加或减。
我通过枚举使用暴力来完成它,它在指数时间内运行很多次。因此,对于较大的问题,这是不可行的。现在我需要快速完成。
只检查组合数是指数时间吗?我必须找到确切的最佳解决方案。
解决此问题的关键字是什么?我试图找到一个复发,所以我可以使用动态编程和某种分支并限制爆炸,但它没用。
我已经研究了cutting mill,subset sum等问题以及许多其他组合优化问题,看看我是否能找到一些想法。但我不明白。简单地验证解决方案是指数时间。
答案 0 :(得分:1)
这只是一个问题,我没有写任何代码,甚至没有任何证据。
由于您只能更改一个值,我会认为消除组合的最简单方法(我知道您不会尝试,但听我说)是将两个数字相加到列表中的另一个数字。因此,在您的示例中1 4 5
,因为1 + 4 = 5
您在那里失去了组合。因此,我会查询一组数字,以确定哪个数字对导致该集合的另一个成员。当你将每个数字与每个其他数字进行比较时,这是O(n^2 lg n)
,并且这样做也会搜索(排序的)数字列表以查找它是否存在。
您的候选人是“碰撞”次数最多的候选人。通过使最易碰撞的数字成为零碰撞数字,您将获得最终结果的最大增加。从那里,只需找到要添加/减去的数字以使其成为非冲突数。我没有找到正确的方法来做到这一点,但我怀疑它可以通过多项式时间的动态编程来完成。
还有另一个与你有联系的严重问题。我认为这是最糟糕的情况,会为您的复杂性添加额外的*n
,因为您最多只能n
联系同时搜索。因此,假设您可以在n^p
时间内计算上述问题,其中p是一些常数多项式,那么整个问题仍应在n^(p+1)
时间内解决。
这肯定是一个问题,我希望这能够揭示它。两个月后,有人不得不捅一下,对吗? :)
答案 1 :(得分:0)
假设问题是:对于n的任何值,n个正整数给出最大组合数。这个问题的答案是:2 ^ 0,2 ^ 1,2 ^ 2,...... 2 ^(n-1)。
证明很简单,因为:
使用此设置,您可以创建介于2 ^ 0和(2 ^ n)-1之间的每个整数。
此集合总和为(2 ^ n)-1。
考虑{1,2,4}。组合为:1,2,1 + 2,4,1 + 4,2 + 4和1 + 2 + 4。 1 + 2 + 4 = 7。
似乎有理由建议,对于任何集合,通过使集合尽可能相似到2 ^ 0,2 ^ 1,...来最大化组合数量。
我不确定“尽可能相似”是什么意思。然而,{1,2,5}更接近{1,2,4} {1,4,5}。这是你用蛮力调查过的其他套装的真实情况吗?
我注意到{1,2,5}距离{1,2,4}只有一个,并且组合少了一个。这是巧合吗?
如果这些观察经得起考验,我怀疑他们不会太难以证明。即使你无法证明它们,它们也可能会给你一个有效的算法。