给定一个数字数组,形成一个子集,使得它可以表示给定数组中的任何数字(允许添加数字)

时间:2014-12-05 11:54:50

标签: arrays algorithm

给定一个包含1到100之间所有数字的数组,并给出数组中的任何数字(1到100)。

我们需要形成一个子集,其中给定数组中的元素最少,否则我们可以表示给定的数字。

如果需要,我们只能从子集中添加数字以形成给定数字。

我们不能从子集的相同索引中添加两次元素。

Few Examples:
Ex:given an array of elements 1,2,3.
Ans:1,2.

如果给定的数字是1.我们可以直接从我们的子集中表示1。

如果给定的数字是2.我们可以直接从我们的子集中表示2。

如果给定的数字是3.我们可以用我们子集中的1 + 2代表3。

我们实际上可以在形成像

这样的子集时复制数字
Ex:given an array of elements 1,2.
Ans:1,2 or 1,1.

答案不能只是1.因为我们不能将相同的1添加两次以形成2。

我的一个朋友问我这个问题而且我被困在如何处理......

任何建议都会有很大帮助...

此外,我无法为这个问题找到一个不错的标题。这是一个经典问题吗?

1 个答案:

答案 0 :(得分:1)

您可以贪婪地解决这个问题:反复选择第一个缺失值。

目前尚不清楚您的数组是否包含1到100之间的所有数字,或者只是其中的一部分。

还不清楚是否必须将数字中的所有数字从1到最大数字,或者只是几个目标值。我将假设您必须能够构建所有中间值。

假设所有数字都存在

首先,我们必须包括数字1。

接下来我们包括数字2.我们现在可以创建最多3个。

接下来包括数字4.我们现在可以使所有内容达到1 + 2 + 4 = 7。

接下来包括数字8.我们现在可以使一切达到1 + 2 + 4 + 8 = 15.

...

接下来包括数字2 ^ k。我们现在可以使一切达到1 + 2 + ... + 2 ^ k = 2 ^(k + 1)。

因此,对于100个数字,您将需要1,2,4,8,16,32,64,并且每个数字最多可以达到127个。

假设存在一个数字子集

假设数组可能是[1,2,3,5,7,9,15]等子集。相同的基本方法有效,但这次我们需要选择数组中小于或等于第一个缺失值的最大数字。

首先包括1。

接下来包括2,我们现在可以将数字设为3。

接下来我们的第一个缺失值是4,但我们没有选择4,所以选择3.我们现在可以达到1 + 2 + 3 = 6.

接下来我们的第一个缺失值是7,所以我们可以选择7.我们的覆盖率现在是1 + 2 + 3 + 7 = 13.

接下来我们的缺失值为14,但我们没有14,所以选择9等等。