Учитывая набор целых чисел и пороговое значение T, разделите набор на как можно больше групп, сумма которых ›= T

Учитывая набор целых чисел и пороговое значение T, разделите набор на как можно больше групп, сумма которых >= T.

Оставшиеся целые числа (сумма которых ‹ T, поэтому нельзя составить другую группу) должны быть оставлены вне групп.

Ограничения:

  • длина списка ‹= 1000
  • значения и T ‹= 1 000 000

Есть ли алгоритм решения этой задачи за полиномиальное время?

Например, учитывая [25,25,25,50,50,50,10] и порог T = 70, он должен вернуть:

[25,50]
[25,50]
[25,50]
Remaining: [10]

Выбор [25,25,25] в качестве одной из групп позволит сформировать только еще одну группу, [50,50], а остальные значения будут [50,10]. Две группы — не оптимальное количество групп, поэтому такое решение будет неверным.


person Greyshack    schedule 19.04.2020    source источник
comment
Почему [25, 25, 25] не является правильным решением?   -  person Damien    schedule 19.04.2020
comment
Извините, изменил оставшееся значение, чтобы лучше проиллюстрировать. Если мы выберем [25,25,25], то сможем сформировать только еще одну группу, например [50,50]. Выбрав [25,50], мы можем получить 3 группы и больше.   -  person Greyshack    schedule 19.04.2020
comment
Все ли числа положительные? Они ограничены?   -  person Damien    schedule 20.04.2020
comment
Положительный и ограниченный, как в описании, ‹ = 1 000 000   -  person Greyshack    schedule 20.04.2020


Ответы (1)


Для этого не существует алгоритма с полиномиальным временем, поскольку он содержит в качестве особого случая np-полную проблему с разделами.

person btilly    schedule 20.04.2020
comment
Где я могу прочитать больше об этом? Как я узнаю, что это частный случай? - person Greyshack; 21.04.2020