【发布时间】:2015-05-15 22:38:32
【问题描述】:
我已经搜索并阅读了有关此问题的算法,但它们似乎不适用于这种情况,或者不够清楚。
我有一个 unsigned 值的List<decimal>,我试图在其中找到 sum 最接近指定值 N的元素p>
列表大小可变,平均有 500 个元素。 性能不是这个解决方案的优先考虑。
如果没有找到解决方案,实现的方法应该返回一个单一解决方案或一个空列表。
现有的不止一个,选一个元素少的。
Example:
N = 15.00
Elements = {
0.10, //EDIT: This shouldn't be here
7.00,
7.00,
14.10,
15.90,
}
Solutions = {
0.10 + 7.00 + 7.00, //EDIT: This shouldn't be here
14.10,
15.90,
}
Final Solution = {14.10} // or 15.90
【问题讨论】:
-
这需要进一步澄清。答案的可能解决方案是什么? Element 中任何数字的任意组合?如果是这样,您的最终解决方案没有意义,因为 14.10 + 0.10 将是 14.20,它比 14.10 更接近 15。
-
我很确定
{14.10 + 0.10}比您提出的“正确”答案更好。无论如何,动态编程可以非常有效地完成这项工作。修剪后的动态规划,更是如此。 -
这与Knapsack Problem密切相关,同样的方法也可以(稍作修改将硬限制改为软限制)
-
分支和绑定解决方案可能是有效的,但任何精确的解决方案都将是 O(2^n),因为这实际上是子集和。
-
我希望它保持开放,我希望看到
C#的实现。