问题是:想象一下,学生有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个小时结束。
但我确定这个算法存在一些问题。其中之一是,也许项目的第二个小时会让你抓住一个好点。所以你不能只考虑项目的第一个小时。
有什么建议吗?
答案 0 :(得分:1)
你的问题似乎与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上工作5小时获得积分