贪婪算法优化

时间:2012-11-22 19:19:30

标签: algorithm dynamic-programming greedy

我有以下问题:

  • 让n个项目。
  • 让Fi(x)等于您花费的积分数 x项目的时间单位i。
  • 您有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)中运行的算法。

1 个答案:

答案 0 :(得分:1)

对于第一种情况,使用堆,构建堆将花费O(n)时间,并且每个ExtractMin&amp; DecreaseKey函数调用将花费O(logN)时间。

对于第二种情况,构造一个nXT表,其中第i列表示情况T = i的解。第i + 1列应该仅取决于第i列和函数F上的值,因此可以在O(nT)时间内计算。我没有彻底考虑所有案例,但这应该给你一个良好的开端。

相关问题