用于实现最大利润的动态算法

时间:2014-01-19 16:03:35

标签: algorithm dynamic-programming

问题是:想象一下,学生有n项目和m小时来完成这些项目。他必须控制自己的时间才能获得最高分。

通过在每个项目上工作1小时,他可以捕获不同的点 例如,通过在项目1上工作一个小时,他可以获得2分,如果他在项目1上工作两个小时,他可以获得2.25分。 项目2是不同的 - 通过在项目2上工作1小时,他可以获得1分,但通过工作两个小时,他可以获得2.5分。

另一个例子:

m = 5且n = 10.意味着有5个项目和10个小时的时间来完成项目。

projectnumber  hours to complete   1 hour work  2h work  3h work  4h work    
     1                3                1.5        2        2.25     _
     2                4                0.5        1.75     2        2.25
     3                3                2          2.25     2.5      _
     4                2                1          2        _        _
     5                5                1          2        2.5      3

我能理解的是:

在考虑了这一点之后,我理解它就像作业调度一样,也许这个问题的最佳算法是动态编程算法。

首先,您应该考虑项目的第一个小时。并按利润下降排序。

2  1.5  1   1   0.5

在完成项目3的第一个小时后,您应该将项目3的第二个小时添加到列表中(剩下9个小时)。

1.5  1   1   0.5  0.25 (0.25 is for second hour of project 3)

它应该持续到你必须完成项目的10个小时结束。

但我确定这个算法存在一些问题。其中之一是,也许项目的第二个小时会让你抓住一个好点。所以你不能只考虑项目的第一个小时。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你的问题似乎与0-1背包问题类似: -

  
      
  1. 总小时数m是背包容量
  2.   
  3. 将每个小时数和对应点视为项目重量和值
  4.   
  5. 最大化积分。
  6.   

0-1背包问题作为伪多项式时间的DP解。

为第N个项目制定问题: -

Knapsack(N,M) = max(Knapsack(N-1,M),Knapsack(N-1,M-1)+Points[N][1]+Knapsack(N-1,M-2)+Points[N][2]......)

注意: - 积分[N] [k] =通过在项目N上工作5小时获得积分

Knapsack Problem