假设您有一组浮点数,例如
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>
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
你真的需要将它减少到整数大小写以获得你可能想要的结果。
对于最常用的浮点格式,基于IEEE 754标准的二进制浮点格式,答案很简单。没有一组浮点数,其总和为5.3。具有一个小数位的唯一可精确表示的值是小数点后面的数字为0或5的那些值。
另一方面,如果要将每个输入乘以10并舍入到最接近的整数,则可以像对整数一样求解。