给定一个包含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。
我的一个朋友问我这个问题而且我被困在如何处理......
任何建议都会有很大帮助...
此外,我无法为这个问题找到一个不错的标题。这是一个经典问题吗?
答案 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等等。