Я пытаюсь попрактиковаться в вопросе интервью в заголовке
Для тех, кто непосредственно хочет знать мой вопрос, перейдите к «Меньшая версия моего вопроса» .
Для получения дополнительной информации читайте дальше.
=> Для N = 2,
Мы можем просто использовать карту.
=> Для N = 3,
существует n ^ 2 решение: Нахождение трех элементов в массиве, сумма которых ближе всего к данному числу
[Проверьте принятый ответ, он фактически даст вам решение на сумму до 0, а не до как в заголовке ссылки]
Я думаю, используя приведенную выше ссылку, мы можем иметь 3 указателя для N = 4 и получить решение n ^ 3.
В любом случае, я хочу подчеркнуть, что в конечном итоге все эти решения не будут масштабироваться с ростом N. Поэтому я ищу решение общего назначения
Я думаю, что это может быть выведено из задачи о подмножестве сумм Проблема подмножества сумм . Однако решение [динамическая версия программирования] этой проблемы возвращает логическое значение. Я ищу фактическое подмножество.
Само логическое решение не совсем естественно для получения [в том смысле, что вы не можете «получить» ответ легко, если вы не прочитали его… Мне пришлось написать пример, чтобы понять его]. В любом случае, я ищу способ изменить его, чтобы дать мне подмножество, а не просто логическое значение.
Меньшая версия моего Вопроса:
Измените это, чтобы вернуть фактическое подмножество, а не просто логическое значение
Let S[i] = true if we can make sum i and false otherwise.
S[0] = true // we can always make sum 0: just don't choose any number
S[i] = false for all i != 0
for each number i in your input
for s = MaxSum downto i
if ( S[s - i] == true )
S[s] = true; // if we can make the sum s - i, we can also make the sum s by adding i to the sum s - i.