带浮点数的子集和

时间:2015-08-08 08:37:12

标签: floating-point dynamic-programming knapsack-problem subset-sum

假设您有一组浮点数,例如

4.2  ; 2.6  ;  6.9  ;  1.1

您需要确定是否存在总和等于5.3的子集,如果存在,则返回此集。

所有给定的数字总是一位小数。

执行此操作的一种方法是通过强力:生成原始集合的所有组合,并单独检查每个组合的总和。然而,这是相当糟糕的,通常这种问题是使用动态编程解决的 - 事实上,这是knapsack problem的一个特殊问题。

我的问题是,既然我们正在考虑花车,你会如何有效地解决这个问题呢?

标准的动态编程方法似乎不是一个好的候选方法,因为它需要我构建一个表,将所有可能的 float 值从0计算到目标数(本例中为5.3) 。既然我们知道我们总是有一个小数点,我想可以想象这样的表:

     0 | 0.1 | 0.2 | ... | 5.3
4.2   
2.6
6.9
1.1

但我不认为这会很好地扩展...(这里,5.3只是为了简单起见,我没有任何关于实际目标值的信息。)< / p>

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

你真的需要将它减少到整数大小写以获得你可能想要的结果。

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

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