Проверьте, является ли мультимножество объединением суммы подмножества другого мультимножества

Я хочу разработать алгоритм для проверки того, является ли мультимножество объединением суммы подмножества другого мультимножества, но я потерпел неудачу после нескольких часов самостоятельной борьбы.

Детали следующие:

Мультимножество A: положительное целочисленное множество

Мультимножество B: положительное целочисленное множество (меньше или равно A, позже вы узнаете, почему)

Функция алгоритма: проверьте, может ли для всех чисел в B соответствовать одно число или сумма чисел в A. Каждое число в A можно использовать только один раз, и все числа в A должны быть использованы. Все числа в B должны совпадать.

Пример, чтобы прояснить это: предположим, мультимножество A = {1, 3, 4, 4, 6}, B = {5, 6, 7}

Тогда алгоритм выдаст «ИСТИНА», так как 5 есть сумма 1 и 4, 6 равно 6, 7 есть сумма 3 и 4. При этом все числа в A используются и используются только один раз, а все числа в Б-ред проверено.

Но для A = {2, 6, 8}, B = {7, 9} алгоритм выдаст «ЛОЖЬ», хотя 2+6+8 = 7+9, но ни одно число в B не является суммой чисел в A .

Некоторые примечания:

1 Известные условия, сумма чисел в А равна сумме чисел в В.

2 Как показывают примеры, определенное число может встречаться несколько раз.

3 Каждое число в мультимножестве можно использовать только один раз, поэтому, если 3 используется в одном решении (чтобы получить 7), его нельзя использовать снова в другом решении. Число 4 встречается дважды, поэтому его можно использовать в двух решениях.

4 Возможны несколько решений для одного числа (например, 7 может быть 1 и 6 или это может быть 3 и 4), но некоторые (например, 7 могут быть 1 и 6) могут быть ошибочными в процессе проверки.

5 Мультимножество А небольшое, не более 30 элементов

Я стараюсь изо всех сил, но мое решение всегда не может охватить все условия мультимножества A и B. Я думал, что решение этого, по-видимому, выше моего понимания.

Так что мне очень нужна помощь ваших умных людей. Помогите мне, пожалуйста. Любой ответ будет принят с благодарностью!


person kingxuke    schedule 06.08.2012    source источник
comment
Использование термина «набор» кажется неуместным. Наборы традиционно не допускают повторяющихся элементов. Набор А в вашем примере следует называть мультисетом или сумкой.   -  person Colin D    schedule 06.08.2012
comment
О, простите за мою небрежность! Спасибо. Исправлено сейчас.   -  person kingxuke    schedule 07.08.2012


Ответы (1)


Это 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
person Grisha Weintraub    schedule 06.08.2012
comment
Спасибо за Ваш ответ. На самом деле я знаю SSP и его разрешение DP. Но ключ в том, что моя проблема более глобальна, чем SSP, если вы внимательно прочитали пост. И с условиями (все элементы положительны), я думаю, должен быть незавершенный алгоритм. Меня не волнует, является ли алгоритм полиномиальным, потому что число мультимножества меньше 40. Мне просто нужна идея. Еще совет? - person kingxuke; 07.08.2012
comment
SSP с положительными числами есть и в NPC, так что общая версия вашей задачи (т.е. без условия 5) тоже сложная. Если вас не волнует эффективность - используйте наивный алгоритм (см. мой отредактированный ответ) - person Grisha Weintraub; 07.08.2012