【发布时间】:2012-11-22 19:19:30
【问题描述】:
我有以下问题:
- 假设有 n 个项目。
- 让 Fi(x) 等于您花费后将获得的点数 在项目 i 上工作的 x 个单位时间。
- 您有 T 个单位的时间来使用和处理您想要的任何项目 喜欢。
目标是最大化您将获得的积分数量,并且 F 函数不递减。
F 函数的边际收益递减,换句话说,在特定项目上花费 x+1 单位时间所获得的总积分的增加将少于在该项目上花费 x 单位时间所获得的总积分增加。
我想出了以下 O(nlogn + Tlogn) 算法,但我应该找到一个在 O(n + Tlogn) 中运行的算法:
sum = 0
schedule[]
gain[] = sort(fi(1))
for sum < T
getMax(gain) // assume that the max gain corresponds to project "P"
schedule[P]++
sum++
gain.sortedInsert(Fp(schedule[P] + 1) - gain[P])
gain[P].sortedDelete()
return schedule
也就是说,对初始增益数组进行排序需要 O(nlogn),循环运行需要 O(Tlogn)。我对这个问题的思考比我愿意承认的要多,并且无法提出可以在 O(n + Tlogn) 中运行的算法。
【问题讨论】:
标签: algorithm dynamic-programming greedy