【发布时间】:2011-06-22 17:44:13
【问题描述】:
我有一个现实问题(不是家庭作业!),需要找到集合 A 的一个子集的总和,该总和等于其他某个集合 B 的一个子集的总和。
一个非常相似的问题,有一个有用的答案is here。
考虑这个例子:
@a = qw(200 2000 2000 2000 4000);
@b = qw(528 565 800 1435 2000 2000 2872);
使用该问题的已接受答案中提供的the code,我得到以下输出:
sum(200 2000 4000) = sum(528 800 2000 2872)
sum(200 4000 4000) = sum(528 800 2000 2000 2872)
sum(200 4000) = sum(528 800 2872)
sum(200 2000 2000 2000 4000) = sum(528 800 2000 2000 2000 2872)
出于我的目的,我只想要使用输入集中元素最少的答案。在这个例子中,我只想要
sum(200 4000) = sum(528 800 2872)
因为所有其他答案的总和中也有 200 和 4000。也就是说,我正在寻找“最简单”的可能总和(从某种意义上说,它们使用最少的元素)。有人可以提出一种合理有效的方法吗? (蛮力是可以的,因为我的数组不是那么大。)
另外,我应该注意输出的第二行 sum(200 4000 4000) ... 不正确,因为 4000 在 @a 中只出现一次。恐怕我对算法的理解不够深入,无法理解为什么会发生这种情况。
我们将不胜感激!
【问题讨论】:
-
?为什么
sum(2000) = sum(2000)不是正确答案?为什么sum(4000)=sum(2000 2000)不是正确答案? -
@mob - 你是对的,他们应该是。另一个问题中给出的算法似乎不太正确。 (也许这个问题是正确的,但我看不出有什么区别。)你的两个答案也是正确的,我希望算法也能提供这些。谢谢。
-
@itzy:感谢您再次注意到我的代码存在的问题!我希望您的问题得到您满意的解决。类似于我的回答中的动态编程(除了正确的......)应该已经解决了你的问题。保重!
标签: algorithm perl subset-sum