【发布时间】:2017-06-15 02:49:12
【问题描述】:
我遇到了以下问题陈述。
您有一个大小为
N的自然数列表,您必须将这些值分布在大小为N/2的两个列表A和B中,以便A元素的平方和最接近可以乘以B元素。示例: 考虑清单 7 11 1 9 10 3 5 13 9 12。
优化后的分布是:
列表 A:5 9 9 12 13
清单 B:1 3 7 10 11
这导致差异 abs( (5+9+9+12+13)^2 - (1*3*7*10*11) ) = 6
因此,您的程序应该输出 6,这是可以达到的最小差异。
我的尝试:
我尝试过贪婪方法来解决这个问题。我取了两个变量sum 和mul。现在我开始一个一个地从给定的集合中获取元素,并尝试将它添加到变量和计算电流中
和和乘法的平方。现在确定两个集合之一中的元素,使组合给出最小的可能值。
但是这种方法在给定的示例中不起作用。我不知道这里可以使用什么方法。
我不要求提供解决方案的确切代码。任何可能的方法及其有效的原因都可以。
编辑:
【问题讨论】:
-
你的方法遇到了什么问题?
-
如何为每个组合获取大小 n/2 的所有可能组合(这里是一个示例 stackoverflow.com/questions/2201113/…)计算 sqrSum 和产品将所有结果放在一个集合中将看到 sqrtSum 和 product,因为邻居会找到差异最小的对
-
@urag 值得注意的是,这需要指数级的时间——如果 n 甚至小到 50 左右,你就会遇到问题。通常指数时间的蛮力解决方案对于此类问题是显而易见的,关键是要找到解决问题的更聪明的方法。
-
@urag 是的。你的算法。将有指数时间。难道不能用一些多项式时间算法来解决吗?
-
@AdriaanKoster 在我的方法中差异并不总是最小的。