【发布时间】:2018-11-12 18:48:23
【问题描述】:
你得到一个数组的所有子集和。然后,您应该从提供的子集总和中恢复原始数组。
保证原始数组中的每个元素都是非负数且小于 10^5。原始数组中的元素不超过 20 个。原始数组也已排序。输入保证有效。
示例 1
如果提供的子集总和是这样的:
0 1 5 6 6 7 11 12
我们可以快速推断出原始数组的大小为 3,因为有 8 (2^3) 个子集。上述输入的输出(即原始数组)是这样的:
1 5 6
示例 2
输入:
0 1 1 2 8 9 9 10
输出:
1 1 8
我尝试了什么
由于保证所有元素都是非负的,因此输入中的最大整数必须是数组的总和。但是,我不确定如何从那里开始。按照逻辑,我认为下一个 (2^2 - 1) 最大的子集总和必须包括数组中除一个元素之外的所有元素。
但是,当原来的数组是这样的时候,上面的逻辑就不行了:
1 1 8
这就是为什么我被卡住并且不确定如何继续。
【问题讨论】:
-
好的,最小的元素呢?你可以用它做任何事吗?
-
输入中的最小整数或原始数组中的最小整数中的最小元素?
-
你确定它是非负数且不是严格正数吗?因为在非负数的情况下,您可以将任意数量的 0 添加到数组中,并且它不会改变它的总和。您将获得无数可能的答案。
-
你的例子的答案也不正确 - 你的总和包含 0 这一定意味着 0 是原始数组的一部分。
-
我想我明白为什么 0 不是问题 - 子集的数量唯一标识输入数组的大小。