【发布时间】:2012-09-11 16:42:02
【问题描述】:
例如:数组:4,3,0,1,5 {假设所有数字都 >=0。数组中的每个元素也对应一个数字。即数组中的每个元素都在 0 到 9 之间。}
在上面的数组中,最大的数是:5430{使用数组中的数字5、4、3和0}
我的方法:
为了能被 3 整除,我们需要数字之和能被 3 整除。 所以,
- 第 1 步:从数组中删除所有零。
- 第 2 步:这些零将出现在末尾。 {因为它们不影响总和,我们必须找到最大的数字}
- 第 3 步:找到数组元素的子集(不包括零),使得位数为 MAXIMUM,并且位数之和为 MAXIMUM,并且总和可被 3 整除。
- STEP-4:所需数字由上述找到的数字按降序排列。
因此,主要步骤是第 3 步,即 如何找到子集,使其包含最大可能数量的元素,使得它们的总和为 MAX 并且可被 3 整除。
我在想,也许第 3 步可以通过 GREEDY CHOICE 来完成,即获取所有元素并继续删除集合中最小的元素,直到总和可以被 3 整除。
但我不相信这种贪婪的选择会奏效。
请告诉我的方法是否正确。 如果是,请建议如何执行步骤3?
另外,请提出任何其他可能/有效的算法。
【问题讨论】:
-
暴力生成所有可能性怎么样?即生成所有能被3整除的组合,然后取最大的?
-
第 3 步有点类似于 subset-sum problem,但它也更容易闻起来(因此它可能是多项式可解的)。但我怀疑贪婪在这里会起作用。
-
@ClemKeirua :是的,蛮力总是一种选择。但我在想是否可以以某种有效的方式完成。
-
@amit:如果我们使用子集和方法,那么我们将不得不考虑 3 的所有倍数:3、2*3、3*3、4*3 ......等等。 . 所以我猜那只会变成指数级。
-
这是我的想法:您删除零,如您所说,它们将被添加到末尾。剩下 N 个非零数字然后您生成具有最大长度 N 的所有可能性。如果您找到某些东西,则取最大值。也许按降序对数字进行排序会更快。如果没有找到,则寻找长度为 N-1 的所有可能性,依此类推,直到找到。
标签: algorithm dynamic-programming greedy