问题陈述如下:给定N
。我们需要找到x1
, x2
, ..
,xp
使得N = x1 + x2 + .. + xp
, p 必须是最小值(表示总和中的项数),并且我们还必须能够从 ( x1,x2,x3..xp)。集合中的数字也可能重复。
例如,如果 N=7。
7 = 1+2+4
和6= (2,4)
, 5= (4,1)
, 4 = (4)
,3=(1,2)
等等。
示例 2:
8 = 1+2+4+1
示例 3:(无效)8 = 1+2+5 但我们无法从 (1,2,5) 的子集中得到 4。所以 (1,2,5) 不是有效组合
我的方法是,如果“N-1”可以写成 p 项的总和,那么“N”要么有 p 项,要么有 p+1 项。但是这种方法需要检查所有可能的组合,这些组合总和为“N-1”并具有“p”项。谁能有比这更好的解决方案?
解决方案:
Step1:假设我们在我们的集合中有“K”个条目作为我们的答案。因此,我们可以从这些数字中获得 2^K 个不同数量的总和,因为每个条目要么出现在总和中,要么不出现在总和中。而且如果数字是“N”,我们需要计算“1”到“N”的总和。因此
(2^K -1) = N
K=log(N+1)
Step2:
在 step1 之后,我们知道我们的答案必须包含“K”个条目,但这些条目实际是什么?假设我们的条目是 (a1,a2,a3...ak)。所以数字 P 可以写成 P = a1*b1 + a2*b2 + a3*b3....+ ak*bk。其中所有 b[i] = 0 或 1。在这里,我们可以将 P 视为二进制数 (b1 b2 b3 bk) 的十进制表示,因此我们可以取 a[i] = 2^(i-1)。