Algorithm 贪婪算法优化

Algorithm 贪婪算法优化,algorithm,dynamic-programming,greedy,Algorithm,Dynamic Programming,Greedy,我有以下问题: 设n个项目 让Fi(x)等于您在花费时获得的点数 x在项目i上工作的时间单位 你有T个时间单位来使用和处理你想做的任何项目 喜欢 目标是最大化您将获得的点数,并且F函数不递减 F函数的边际收益递减,换句话说,在某个特定项目上花费x+1个单位的时间比在该项目上花费x个单位的时间所得的总分增长要少 我提出了以下O(nlogn+Tlogn)算法,但我应该找到一个在O(n+Tlogn)中运行的算法: sum=0 附表[] 增益[]=排序(fi(1)) 对于sum

我有以下问题:

  • 设n个项目
  • 让Fi(x)等于您在花费时获得的点数 x在项目i上工作的时间单位
  • 你有T个时间单位来使用和处理你想做的任何项目 喜欢
目标是最大化您将获得的点数,并且F函数不递减

F函数的边际收益递减,换句话说,在某个特定项目上花费x+1个单位的时间比在该项目上花费x个单位的时间所得的总分增长要少

我提出了以下O(nlogn+Tlogn)算法,但我应该找到一个在O(n+Tlogn)中运行的算法:

sum=0
附表[]
增益[]=排序(fi(1))
对于sum

也就是说,需要O(nlogn)对初始增益阵列进行排序,并需要O(Tlogn)在循环中运行。我对这个问题的思考超过了我愿意承认的程度,因此无法想出一个在O(n+Tlogn)中运行的算法。

对于第一种情况,使用堆,构建堆将花费O(n)时间,而每次ExtractMin&DecreaseKey函数调用将花费O(logN)时间


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

我不知道在线性时间内构建最小/最大堆的能力;非常感谢,这允许我的案例1解决方案在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