【发布时间】:2015-08-08 21:51:58
【问题描述】:
假设您有一组浮点数,例如
4.2 ; 2.6 ; 6.9 ; 1.1
并且需要判断是否存在总和等于5.3的子集,如果存在则返回这个集合。
所有给定的数字总是有一位小数。
执行此操作的一种方法是蛮力:生成原始集合的所有组合,并分别检查每个组合的总和。然而,这是相当糟糕的,通常这种问题是使用动态编程来解决的——事实上,这是knapsack problem 的一个特殊之处。
我的问题是,既然我们正在考虑浮动,您将如何有效地解决这个问题?
标准动态编程方法似乎不是一个很好的选择,因为它需要我建立一个表格来计算从 0 到目标数字(本例中为 5.3)的所有可能的 float 值.既然我们知道我们总是有一位小数,我想可以想象这样的表格:
0 | 0.1 | 0.2 | ... | 5.3
4.2
2.6
6.9
1.1
但我认为这不会很好地扩展......(这里,5.3 只是为了简单起见的一个值,我没有任何关于在实践中绑定目标值的信息。)
关于如何解决这个问题的任何想法?
【问题讨论】:
-
一位小数的浮点数 只是分散注意力。想想整数。
-
@HighPerformanceMark 当然,我可以使用 HashMap 来关联它们,但我的观点是,按照动态编程方法,我需要尽可能多的列在 0 和目标值之间浮动。 ?
标签: floating-point dynamic-programming knapsack-problem subset-sum