Моя мысль состояла в том, чтобы определить, какая группа чисел равна дельте между двумя наборами, и это напрямую определило бы проблему.
Проблема " с учетомцелое число s и набор целых чисел, является ли любое непустое подмножество из установленной суммы в s?"известным как" проблема суммы подмножеств".Это чрезвычайно хорошо изучено, и это NP-Complete.(См. эту ссылку для получения информации о связанной проблеме.)
То есть, это одна из самых сложных проблем, которую необходимо решить за разумное время.Широко распространено мнение (хотя в настоящее время не доказано ), что для этой задачи не может существовать никакого алгоритма за полиномиальное время.Лучшее, что вы можете сделать, это что-то вроде O (2 ^ n) для набора, содержащего n элементов.
(Замечу, что ваша проблема в числах с плавающей точкой, а не в целых числах. Это на самом деле не имеет значения, если вы правильно обрабатываете сравнение рассчитанной суммы с целевой суммой для обработки любой ошибки округления, которая может иметьНакапливается при суммировании.)
Для небольшого количества элементов - вы говорите, что в наборе их всего 15 или около того - лучше всего просто попробовать их все исчерпывающе.Вот как вы это делаете.
Хитрость заключается в том, чтобы понять, что существует одно подмножество для каждого целого числа от 0 до 2 ^ n.Если вы посмотрите на эти числа в двоичном виде:
0000
0001
0010
0011
...
каждое соответствует подмножеству.Первый не имеет участников.Второй имеет только группу 1. Третий имеет только группу 2. У четвертого есть группа 1 и группа 2. И т. Д.
Псевдокод достаточно прост:
for each integer i from 1 to 2^n
{
sum = 0;
for each integer b from 1 to n
{
if the bth bit of i is on then sum = sum + group(b)
}
if sum == target then print out i in binary and quit
}
quit with no solution
Очевидно, этоявляется O (n 2 ^ n).Если вы можете найти алгоритм, который всегда работает лучше, чем O (c ^ n), или докажет , что вы не можете найти такой алгоритм, тогда вы станете знаменитыми навсегда.
В статье Википедии есть лучший алгоритм, который дает ответ намного быстрее большинство , но не все времени.Сначала я остановлюсь на наивном алгоритме, так как на его создание у вас уйдет всего несколько минут;если он неприемлемо медленный, перейдите к более быстрому и более сложному алгоритму.