“这已接近学期结束,你有最后的项目需要完成。当然,你的目标是最大限度地提高你在这些项目上的总成绩!为简单起见,说你有总共H小时(a累积整数项目,你将在每个项目上花费整数小时。
要弄清楚如何最好地划分时间,你会得出一组非递减估计 函数{e1,e2 ,. 。 。 ,en},每个项目一个:如果你在项目i上花费h小时(其中0 <= h <= H),你将获得该项目的ei(h)等级。
给出一个动态编程算法,该算法采用估计函数{e1 ,. 。 。 ,en}作为输入和 产生非负数小时{h1 ,. 。 。 ,hn}使得(h1 + h2 +···+ hn)= H并且你的总等级(e1(h1)+ e2(h2)+···+ en(hn))是最大的。要获得满分,请证明您的重现,并简要分析算法的运行时间。“
答案 0 :(得分:0)
这听起来像是cormen在算法介绍中描述的日志切割问题。如果你没有它,我建议你把它拿起来。
这是一个在线参考,但我相信你可以找到其他人。 http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/
答案 1 :(得分:0)
我认为问题可以解决如下。
动态程序的状态空间被建模为n+1
- 元组
(h,h1,...hn)
总共h
小时为e1(h1)+...+en(hn)
小时e1(0),...,en(0)
。对于初始化,请将状态值设置为h=0
,其中0
(此值应为h
,否则未明确说明。)
然后以递增的顺序迭代h
;在直觉上,正如e1,...,en
内容,你允许一个单位更多的时间来解决问题。由于效用函数h+1
单调递增,问题是决定应该花费多少时间单位。这意味着对于(h+1,h1+1,h2,...,hn),...,(h+1,h1,h2,...,hn+1)
,e1,...en
的值必须由h=H
进行评估;最大值的选择将被存储。
最后,最后一个元组({{1}})产生结果。