验证多集是否是另一个多集的子集和的并集

时间:2012-08-06 16:35:20

标签: algorithm verification subset-sum

我想弄清楚一个算法来验证多重集合是否是另一个多重集的子集和的并集,但是在我自己挣扎了好几个小时后我失败了。

详情如下:

Multiset A:正整数集

Multiset B:一个正整数集(小于或等于A,以后你会知道为什么)

算法功能:验证对于B中的所有数字,A中的一个数字或一个数字总和是否可以匹配它们。 A中的每个数字只能使用一次,并且必须使用A中的所有数字。 B中的所有数字必须匹配。

清除此事的一个例子: 假设多集A = {1,3,4,4,6},B = {5,6,7}

然后算法将输出“TRUE”,因为5是1和4之和,6等于6,7是3和4的总和。同时A中的所有数字仅使用和使用一次,而检查B中的所有数字。

但是对于A = {2,6,8},B = {7,9},算法将输出“FALSE”,尽管2 + 6 + 8 = 7 + 9,但B中没有数字是A中的数字。

一些注意事项:

1已知条件,A中的数字总和等于B中的数字之和。

2如示例所示,某个数字可以多次出现。

3多集中的每个数字只能使用一次,因此如果在一个解决方案中使用3(获得7),则不能在另一个解决方案中再次使用它。数字4出现两次,因此可以在两种解决方案中使用。

4可以为一个数字提供多个解决方案(例如7可以是1和6,也可以是3和4),但有些(如7可能是1和6)可能在整个过程中出错。

5 Multiset A不大,最多30个元素

我尽我所能,但我的解决方案始终无法涵盖多重集A和B的所有条件。我认为解决方案显然超出了我的范围。

所以,我真的需要你聪明人的帮助。请帮我。任何答案将不胜感激!

1 个答案:

答案 0 :(得分:2)

是NP完全问题(减少到“子集和问题”非常简单)。 所以这个问题没有有效的解决方案。

您可以在此处查看不同的解决方法: http://en.wikipedia.org/wiki/Subset_sum_problem

天真的算法:

naiveAlg(A,B) :
  for each partition P of A such that |P| = |B| do :
    for each element E in P do :
      calculate the sum of E numbers and store in E'
    if E' is equal to B return true
  return false