注意:这是this problem的n乘数变体。
给出一个集A
,该集由0.0到1.0之间的十进制值组成,找到该集B
,这样b
中的每个B
都是一个由十进制组成的集合值介于0.0到1.0之间,因此对于a
中的每个A
,都有一组唯一的值,其中a
是B
中元素子集的乘积。
例如,给定
$ A = [0.125, 0.25, 0.5, 0.75, 0.9]
B的一种可能(但可能不是最小)的解决方案是
$ B = solve(A)
$ print(B)
[[0.25, 0.5, 0.75, 0.9], [etc.], [etc.]]
这满足了最初的问题,因为A[0] == B[0] * B[1]
,A[1] == B[1]
等使我们可以重新创建原始集合A
。 B
的长度小于A
的长度,但我猜答案也较小。但是,假设不能将B减少到4个以上的值,那么对该问题的正确解决方案将是一组解决方案。
我假设B
的解决方案空间很大,如果不是无限的话。如果存在解决方案,将如何找到最小集B
?
注意:
A = [0.125, 0.25, 0.5, 1.0]
,则B的有效答案可能是[0.5, 1.0]
。含义A == [ B[0]*B[0]*B[0], B[0]*B[0], B[0]*B[1], B[1]*B[1] ]
B
中解决方案的下限为|B| ≥ log2(|A| + 1)
,因为我们最多可以拥有2^|B| - 1
的{{1}}个非空子集。 (为此,请记入גלעד ברקן。)