问题陈述如下:
给定N。我们需要找到x1x2..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=对数(n+1)
第二步:
在步骤1之后,我们知道我们的答案必须包含“K”项,但这些项实际是什么假设我们的条目是(a1,a2,a3…ak)所以p可以写成
p=a1*b1+a2*b2+a3*b3….+ak*bk,其中所有b[i]=0或1。在这里,我们可以看到p是二进制数(b1b2b3bk)的十进制表示,因此我们可以取a[i]=2^(i-1)。

最佳答案

你应该取所有的数字1,2,4….2^k,n-(1+…+2^k)。(仅当不等于0时最后一个)
证明
首先,如果我们只得到k数,则除了0之外,我们可以得到最大的2^k - 1不同的和。所以如果N>=2^k,我们至少需要k + 1个数所以你可以看到,如果我们的一组数字是正确的,那么它是按大小最小的(或最小值之一)
很容易看出,我们可以用第一个数字得到从0到2^(k+1) - 1的任意数字。如果我们需要更多呢?我们只得到最后一个数字,因为它小于2^(k + 1)然后用第一个元素得到差异

09-07 05:03