我正在尝试在标题中练习面试问题
对于那些直接想知道我的问题的人,请跳转到“我的问题的较小版本”。
有关更多背景信息,请继续阅读。
=>对于N = 2, 我们可以简单地使用Map。
=>对于N = 3, 有一个n ^ 2解决方案:Finding three elements in an array whose sum is closest to a given number [检查接受的答案,它实际上为你提供了一个总和为0的解决方案,而不是链接标题中的最终解决方案]
我想使用上面的链接,我们可以有N = 4的3个指针并得到一个n ^ 3解决方案。
无论如何,我的观点是,最终所有这些解决方案都不会随着N的增长而扩展。所以我正在寻找一个通用的解决方案
我认为这可以从子集和问题Subset sum problem中得出。但是,针对此问题的解决方案[动态编程版本]返回一个布尔值。我希望得到实际的子集 布尔解决方案本身并不是完全自然地导出[在某种意义上你不能轻易地“得出”答案,除非你已经读过它。我必须写下一个例子来理解它]。无论如何,我正在寻找一种方法来修改它,给我一个子集,而不仅仅是一个布尔值。
我的问题的较小版本:
修改它以返回实际的子集,而不仅仅是布尔值
Let S[i] = true if we can make sum i and false otherwise.
S[0] = true // we can always make sum 0: just don't choose any number
S[i] = false for all i != 0
for each number i in your input
for s = MaxSum downto i
if ( S[s - i] == true )
S[s] = true; // if we can make the sum s - i, we can also make the sum s by adding i to the sum s - i.
答案 0 :(得分:1)
只需使S[s]
包含可能的数字列表:
Let S[i] = the list of numbers that make up that sum and false (or null, something distinct from an empty list) otherwise.
S[0] = empty list // we can always make sum 0: just don't choose any number
S[i] = null for all i != 0
for each number i in your input
for s = MaxSum downto i
if ( S[s - i] != null )
S[s] = S[s-i] with i added; // if we can make the sum s - i, we can also make the sum s by adding i to the sum s - i.