问题陈述如下:
给定N
。我们需要找到x1
,x2
,..
,xp
,以便N = x1 + x2 + .. + xp
,p必须最小(表示总和中的术语数),我们也必须能够从(x1,x2,x3..xp)的子集之和得到从1到(N-1)的所有数字。集合中的数字也可能重复。
例如,如果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”项。除此之外,任何人都可以有更好的解决方案吗?
解决方案:
步骤1:
假设我们的集合中有“K”条目作为答案。因此,我们可以从这些数字中获得2 ^ K个不同数量的和,因为每个条目将出现或不出现在总和中。而且如果数字是“N”,我们需要计算'1'到'N'的总和。因此
(2 ^ K -1)= N
¥K = log(N + 1)
第二步:
在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),因此我们可以得到[i] = 2 ^(i-1)。
答案 0 :(得分:5)
你应该取所有数字1,2,4 ...... 2 ^ k,N-(1 + ... + 2 ^ k)。 (仅当它不等于0时才是最后一个)
首先,如果我们只获得k
个数字,我们可以获得除{0之外的最大2^k - 1
个不同的总和。因此,如果N>=2^k
,我们至少需要{{1}数字。所以你可以看到,如果我们的数字组正确地确定它的最小尺寸(或最小值之一)
很容易看出我们可以使用第一个数字从0到k + 1
得到任何数字。如果我们需要更多?我们只是得到最后一个数字,因为它小于2^(k+1) - 1
。并使用第一个元素
答案 1 :(得分:0)
我还没有用完这个数字,但是你应该非常感兴趣的是你已经列出了前两个的两个权力。
如果我正在寻找更好的解决方案,那就是我要开始的地方。