Algorithm 实现利润最大化的动态算法

Algorithm 实现利润最大化的动态算法,algorithm,dynamic-programming,Algorithm,Dynamic Programming,问题是:假设一个学生有n个项目和m个小时来做项目。他必须管理好自己的时间,以获得尽可能多的分数 通过在每个项目上工作1小时,他可以抓住不同的要点。 例如,在项目1上工作一小时,他可以得到2分,如果他在项目1上工作两小时,他可以得到2.25分。 项目2不同——在项目2上工作1小时,他可以得到1分,但在项目2上工作2小时,他可以得到2.5分 另一个例子: m=5,n=10。意味着有5个项目和10个小时的时间来做这些项目 projectnumber hours to complete 1 hou

问题是:假设一个学生有
n个
项目和
m个
小时来做项目。他必须管理好自己的时间,以获得尽可能多的分数

通过在每个项目上工作1小时,他可以抓住不同的要点。
例如,在项目1上工作一小时,他可以得到2分,如果他在项目1上工作两小时,他可以得到2.25分。
项目2不同——在项目2上工作1小时,他可以得到1分,但在项目2上工作2小时,他可以得到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小时)

它应该一直持续到你必须完成项目的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
但是我确信这个算法有一些问题。其中之一是,也许项目的第二个小时会让你抓住一个好的观点。所以你不能只考虑项目的第一个小时。

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

有什么建议吗?

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

  • 总小时数m是背包容量
  • 将每个小时数和相应点视为项目重量和值
  • 最大化积分
  • 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中工作k小时所获得的点数


    对我来说,这听起来像是一个贪婪的算法,而不是DP。谢谢编辑Dukeling。你是说它就像背包?!!你描述的算法听起来很像,但是你提到了动态规划,所以我想我应该指出这一点。(但是,是的,听起来很像背包问题)如果项目2第4小时的分数是30分怎么办?在预算为10小时的情况下,贪婪算法永远不会接近它。DP方法可能需要稍加修改。。。(例如,你不能在不工作的第一个小时工作第二个小时)是的,问题是你应该一个小时一个小时地做每一个项目。你有两个小时的时间拿到最好的分数。项目1:hour1:3小时R2:3.5项目2:hour1:0.5小时R2:5。。所以这个算法fails@SamanParser检查问题的公式以解决您的问题