Идея грубой силы проста:
- Создайте все возможные подмножества из ваших 20 предметов, сохранив только те, которые удовлетворяют вашему ограничению веса.Если вы хотите проявить фантазию, вы можете даже рассмотреть только те подмножества, к которым вы не можете добавить ничего, не нарушая ограничения по весу, поскольку только они могут быть правильным ответом.O (2 ^ n)
- Найти подмножество с максимальным весом.линейный с точки зрения количества кандидатов, и, поскольку у нас есть O (2 ^ n) кандидатов, это O (2 ^ n).
Пожалуйста, прокомментируйте, если вам нужен какой-нибудь псевдокод.
РЕДАКТИРОВАТЬ: эй, вот псевдокод на всякий случай.
GetCandidateSubsets(items[1..N], buffer, maxw)
1. addedSomething = false
2. for i = 1 to N do
3. if not buffer.contains(item[i]) and
weight(buffer) + weight(items[i]) <= maxw then
4. add items[i] to buffer
5. GetCandidateSubsets(items[1..N], buffer)
6. remove items[i] from buffer
7. addedSomething = true
8. if not addedSomething then
9. emit & store buffer
Обратите внимание, что функция GetCandidateSubsets не очень эффективна, даже для реализации грубой силы.Спасибо за указание на это.Вы можете переделать это, чтобы обходить только комбинации, а не перестановки набора элементов, в качестве оптимизации первого прохода.
GetMaximalCandidate(candidates[1..M])
1. if M = 0 then return Null
2. else then
3. maxel = candidates[1]
4. for i = 2 to M do
5. if weight(candidates[i]) > weight(maxel) then
6. maxel = candidates[i]
7. return maxel