【发布时间】:2014-02-08 17:51:34
【问题描述】:
问题是:想象一个学生有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 个小时)。
1.5 1 1 0.5 0.25 (0.25 is for second hour of project 3)
它应该一直持续到你必须完成项目的 10 小时时间结束。
但我确信这个算法有一些问题。其中之一是,也许一个项目的第二个小时会让你抓住一个好点。所以你不能只考虑项目的第一个小时。
有什么建议吗?
【问题讨论】:
-
对我来说这听起来像是一个贪心算法,而不是 DP。
-
感谢您编辑 Dukeling。你是说它像背包?!!
-
您描述的算法听起来像a greedy algorithm,但您提到了动态编程,所以我想我只是指出这一点。 (但是,是的,这听起来像是背包问题)
-
如果项目 2 第 4 小时的积分是 30 分怎么办?预算为 10 小时,贪心算法永远不会接近它。
标签: algorithm dynamic-programming