用于获得具有最小项数的和的算法

时间:2013-07-13 02:05:48

标签: algorithm recursion

问题陈述如下: 给定N。我们需要找到x1x2..xp,以便N = x1 + x2 + .. + xp,p必须最小(表示总和中的术语数),我们也必须能够从(x1,x2,x3..xp)的子集之和得到从1到(N-1)的所有数字。集合中的数字也可能重复。

例如,如果N = 7。

7 = 1+2+46= (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)。

2 个答案:

答案 0 :(得分:5)

你应该取所有数字1,2,4 ...... 2 ^ k,N-(1 + ... + 2 ^ k)。 (仅当它不等于0时才是最后一个)

证明

  1. 首先,如果我们只获得k个数字,我们可以获得除{0之外的最大2^k - 1个不同的总和。因此,如果N>=2^k,我们至少需要{{1}数字。所以你可以看到,如果我们的数字组正确地确定它的最小尺寸(或最小值之一)

  2. 很容易看出我们可以使用第一个数字从0到k + 1得到任何数字。如果我们需要更多?我们只是得到最后一个数字,因为它小于2^(k+1) - 1。并使用第一个元素

  3. 获得差异

答案 1 :(得分:0)

我还没有用完这个数字,但是你应该非常感兴趣的是你已经列出了前两个的两个权力。

如果我正在寻找更好的解决方案,那就是我要开始的地方。