Для игры, которую я делаю, у меня есть ситуация, когда у меня есть список чисел – скажем, [7, 4, 9, 1, 15, 2] (названный A
для этого) – и другой список чисел – скажем [11, 18, 14, 8, 3] (названный B
) – предоставлено мне. Цель состоит в том, чтобы найти все комбинации чисел в A
, которые добавляют к числу в B
. Например:
- 1 + 2 = 3
- 1 + 7 = 8
- 2 + 9 = 11
- 4 + 7 = 11
- 1 + 2 + 4 + 7 = 14
- 1 + 2 + 15 = 18
- 2 + 7 + 9 = 18
... и так далее. (Для этого 1 + 2
совпадает с 2 + 1
.)
Для небольших списков, подобных этому, тривиально просто грубо заставлять комбинации, но я сталкиваюсь с возможностью увидеть тысячи до десятков тысяч этих чисел и будет использовать эту процедуру повторно на протяжении всего срока действия приложения. Есть ли какой-либо изящный алгоритм, доступный для достижения этого в разумные сроки со 100% охватом? В противном случае, есть ли какая-то достойная эвристика, которую я могу найти, которая может дать мне "достаточно хороший" набор комбинаций за разумное время?
Я ищу алгоритм в псевдокоде или на любом прилично популярном и читаемом языке (обратите внимание на "и" там...;) или даже на простое английское описание того, как можно было бы реализовать этот вид поиска.
Отредактировано для добавления:
Довольно много хорошей информации. Спасибо, парень! Суммируя сейчас:
- Проблема заключается в NP-Complete, поэтому нет достаточной силы для получения 100% -ной точности в разумные сроки.
- Проблема может рассматриваться как вариант либо сумма подмножества, либо knapsack. Известны эвристики для обоих, которые могут быть адаптированы к этой проблеме.
Держите идеи! И еще раз спасибо!