【发布时间】:2013-06-06 15:34:19
【问题描述】:
我正在尝试解决一个问题,即你将得到一个整数 N,它是 0
我想得到最接近 N 或完全等于 N 的数组子集的总和。问题指出总和应该完全等于 N,但是如果没有子集可以完全达到 N,所以我们应该带上最接近但小于 N 的。例如:
N = 11 和 Array = { 2 , 3 , 5 , 7 } 在这种情况下输出应该是 10
N = 12 和 Array = { 4 , 6 , 9 } 在这种情况下输出应该是 10
N = 10 和 Array = { 2 , 3 , 3 , 10 } 在这种情况下输出应该是 10
我试图用所有排列来解决这个问题,但它给了我时间限制,因为输入约束很高。我尝试使用动态编程,但二维数组存储给出的内存限制超过了mem[150001][2001]。我尝试在 [150001][2] 中这样做,因为提到了一些关于 DP 的教程,但我做不到。任何帮助将不胜感激。
【问题讨论】:
-
和我刚刚回答的this question类似。我使用 DP,但不需要二维数组。一维就够了。
-
当然,您可以将检查限制为组合而不是排列,这将减少您的时间和内存使用量。
-
您(需要)使用什么语言?或者你需要伪代码?给定的数组总是排序的吗?如果没有,请尝试对其进行排序,这很有帮助:)
-
Java :) 或任何类似的语言
-
这个问题的第一部分(确定是否存在精确的和)是 NP 完全子集和问题。一般情况的有效解决方案将是一个重大发现,但对于特殊情况有一些很好的算法。请参阅维基百科文章 [en.wikipedia.org/wiki/Subset_sum_problem] 开始。