Проблема с суммой подмножества - PullRequest
1 голос
/ 08 апреля 2019

Я работаю над решением проблемы Subset - Sum. Постановка проблемы -

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

Пример: Input: set[] = {3, 34, 4, 12, 5, 2}, sum = 9 Output: True //There is a subset (4, 5) with sum 9.

Я видел разные подходы к решению этой проблемы. Один из них использует рекурсию, а другой - динамическое программирование.

Мой вопрос: почему мы не можем решить проблему, используя вложенные циклы. Каждый из них рассматривает элемент и проверяет его по одному, составляет ли он полную сумму или нет?

Извините, я новичок в алгоритмах и прочем.

1 Ответ

2 голосов
/ 08 апреля 2019

На самом деле можно решить проблему суммы подмножеств с (большим количеством) вложенных циклов. Это, вероятно, будет упоминаться как «нерекурсивный грубый метод наивного подхода», или что-то в этом роде.
Вы, вероятно, никогда этого не увидите, потому что это очень, очень, ... очень неуклюжий способ решения проблемы.
Действительно, вам понадобится столько вложенных циклов, сколько у вас есть элементов в вашем входном наборе, что будет означать написание отдельной программы для каждого случая (1 элемент в вашем начальном наборе, 2 элемента в вашем начальном наборе и т. Д. И т. Д.).
Или, в конце концов, написание программы, которая принимает заданный размер N в качестве входных данных и пишет программу с вложенными циклами N. Но результат, в любом случае, будет настолько далеко от «хорошей практики кодирования», насколько это возможно.

Рекурсивный подход делает именно это (он строго эквивалентен множеству вложенных циклов, каждый рекурсивный вызов отправляет вас в «новый» цикл), но гораздо проще и элегантнее (несмотря на полное перечисление подмножеств установить, что очень и очень дорого). Более простой код легче проверять, легче редактировать, легче тестировать, легче отлаживать ... (и так далее ... передовой опыт часто здесь по причине).

...