【问题标题】:Subset Sum with Floats带浮点数的子集和
【发布时间】: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


【解决方案1】:

您确实需要将其简化为整数大小写以获得您可能想要的结果。

对于最常见的浮点格式,基于 IEEE 754 标准二进制浮点的那些,答案很简单。不存在总和为 5.3 的浮点数集。唯一可精确表示的具有一位小数的值是那些小数点后的数字为 0 或 5 的值。

另一方面,如果要将每个输入乘以 10 并四舍五入到最接近的整数,则可以像求解整数一样求解它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多