Я даже не уверен, что это можно сделать за полиномиальное время.
Проблема:
Даны два массива действительных чисел,
A = (a[1], a[2], ..., a[n]), B = (b[1], b[2], ..., b[n]), (b[j] > 0, j = 1, 2, ..., n)
и число
k
, найти подмножествоA'
числаA (A' = (a[i(1)], a[i(2)], ..., a[i(k)]))
, которое содержит ровноk
элементов, такое, что(sum a[i(j)])/(sum b[i(j)])
максимально, гдеj = 1, 2, ..., k
.
Например, если результатом является k == 3
, а {a[1], a[5], a[7]}
, то
(a[1] + a[5] + a[7])/(b[1] + b[5] + b[7])
должно быть больше, чем любая другая комбинация. Любая подсказка?
n
выбратьk
возможных соотношений, так что это устанавливает верхнюю границу сложности. Я рассматривал способ выбрать наибольшее отношениеa[i]/b[i]
для начала, а затем выбрать индекс, который делает случайk=2
максимально большим. Таким образом, вы должны сравнитьn-1
отношения на этом шаге. Затем продолжите, выбрав третий индекс. Доказать, что это всегда будет давать наилучшее соотношение после того, как вы выбралиk
индексов, может быть сложно (или это может быть не так!), но попытка доказать может дать некоторое представление. - person JohnPS   schedule 12.11.2011