问题描述
假设您每天有 t1
,t2
,t3
,...,tn
任务要完成。而一旦你开始工作,你只能完成c1
、c2
、c3
、...、cn
的任务,直到休息1天。你也可以多休息几天。但是你只能做当天给你的任务。例如;
T[] = {10,1,4,8}
给定的任务;C[] = {8,2,1}
是每天完成任务的能力。
对于此示例,最佳解决方案是在第 3 天休息。这样你就可以在 4 天内完成 17 个任务:
- 第 8 天(最多 10 个任务,但
c1=8
) - 第 2 天(最多 1 个任务,
c2=4
) - 第 0 天(休息以重置为
c1
) - 第 8 天(最多 8 个任务,
c1=8
)
任何其他计划都会导致完成的任务更少。
我试图找到这个动态规划问题的递推关系。谁能帮我?我发现了这个问题,但我的问题有所不同,因为工作能力下降,每天有不同数量的工作。 Reference
解决方法
如果我猜对了,您有大量任务要做,每天 t(i)
i
。此外,您还有某种给定的内部限制序列 c(j)
,用于当前的连续行驶日 j
,如果当天没有完成任何任务,j
可以重置为 0
。目标是最大化解决的任务。
简单的方法是为每天 i
存储每个状态 j
完成了多少任务的列表。填写第一天的数据。然后在接下来的每一天填写“无中断”情况的值 - 即
value(i-1,j-1)+min(t(i),c(j))
。选择前一天的最大值来填充“中断”条目。重复直到最后一天。选择最大值并回溯路径。
以上示例
内存消耗非常简单:O(number of days * number of states)
。
如果您只对值感兴趣而不对计划感兴趣,则内存消耗将是 O(number of states)
。
时间消耗有点复杂,所以让我们写一些伪代码:
For each day i
For each possible state j
add and write values
choose maximum from previous day for break state
choose maximum
For each day
trace back path
choose maximum
函数的复杂度为 O(number of states)
。
这个伪代码也会导致时间消耗 O(number of days * number of states)
。