子集和Prob。 - 递归步骤

时间:2017-02-01 18:44:08

标签: algorithm

这个问题与(EXTRACT(HOUR FROM TIME_DIFF) * 60) + EXTRACT(MINUTE FROM TIME_DIFF) + (EXTRACT(SECOND FROM TIME_DIFF) * 1.00 / 60)

有关

假设我们有n个正整数a [1],a [2],...,a [n],我们得到一个整数M.我们想知道是否有一个整数M的子集

如果存在[1]的子集,则设置v [i,m] = 1,a [2],...,a [i]和m,否则v [i,m] = 0。

如果v [i,m] = 1则必须是因为我们只能通过使用数字a [1],a [2],...,a [i-1]得到m或者因为我们可以通过使用相同的数字得到总和m - a [i]。我们得到了递归。

  • 如果v [i,m] = 1,有人可以解释第一个条件必须保持或第二个条件必须保持的最后一个段落吗?是否有证明任何一个条件必须保持?

让我们举一个n正整数的例子:[3,2,7,1]和M = 6,然后我们有一个子集[3,2,1]

(ACTL_END_DT - ACTL_START_DT) DAY(4) TO SECOND

这意味着我们可以删除整数1并使3 + 2 = 6,这不会成立,所以我们继续下一个条件:

Subset Sum problem with positive integers

当然3 + 2 = 6-1 - 这种情况应该始终保持。

我在理解他们想说的内容时遗漏了一些东西,有人可以填写吗?

1 个答案:

答案 0 :(得分:1)

假设

假设我们知道有一个[1],一个[2],...,a [i]的子集,其总和为m。

问问自己该子集是否包含[i]。

如果答案为否

然后可以使用相同的子集来显示a [1],a [2],...,a [i-1]的一个子集,其总和为m。

如果回答为是

然后我们知道有一个子集(x,y

因此a [x] + a [y] + ... = m-a [i]

因此,有一个[1],...,a [i-1]的子集,其总和为m-a [i]

结论

所以我们已经证明,如果v [i,m]等于1,那么必须保持一个或其他条件。 (这两种情况也可能成立。)

替代观点

建设性地看待这一点似乎更自然。

将您可以作为[1],..,a [i-1]的子集的所有值想象一下。在你的例子中[3,2,7]可以生成所有值[0,2,3,5,7,10,12,13]。

然后考虑如果我们也可以包含[i],我们可以制作什么值。这将是与一组值相交的原始值集[0,2,3,5,7,10,12,13],其中[i]加[0 + 1,2 + 1,3 + 1, 5 + 1,7 + 1,10 + 1,12 + 1,13 + 1]。

因此,如果m在旧集合中,或者如果m-a [i]在旧集合中,则值m将在新集合中。