带浮点数的子集和

Subset Sum with Floats

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

4.2  ; 2.6  ;  6.9  ;  1.1

然后判断是否存在和等于5.3的Subset,如果存在,return这个集合。

所有给定的数字始终保留一位小数。

一种方法是通过蛮力:生成原始集合的所有组合,并分别检查每个组合的总和。然而,这是相当糟糕的,通常这种问题是使用动态规划来解决的——实际上,这是 knapsack problem.

的一个特殊问题。

我的问题是,由于我们正在考虑浮动,您将如何有效地解决这个问题?

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

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

但我认为这不会很好地扩展...(这里,5.3 只是为了简单起见的一个值,我没有任何关于实践中目标值约束的信息。)

关于如何解决这个问题有什么想法吗?

您确实需要将其简化为整数情况才能获得您可能想要的结果。

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

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