我认为一个简单的动态规划就可以了:
T(i, j) = 0 #if i>|apples|
T(i, j) = T(i+1, j) #if j/k >= rot(i)
T(i, j) = max(value(i) + T(i+1, j+1), T(i+1, j)) #if j/k < rot(i)
Run Code Online (Sandbox Code Playgroud)
意思是T(i, j)在卖掉j个苹果后,卖到第i个苹果的利润最大。
在每个 DP 步骤中,您必须在出售或不出售当前苹果之间做出最佳选择。如果到目前为止已售出的苹果数量 ( j) 除以可售出的苹果数量除以时间单位 ( k),达到苹果的“腐烂时间”( rot(i)),则无法售出。
这里的一个技巧是,你必须首先按照“腐烂时间”对苹果进行排序。
我将在这里粘贴 Ilmari Karonen 的评论,因为它解释了算法的正确性,而不仅仅是评论。
请注意,该解决方案的正确性主要取决于这样的观察:如果苹果的某个子集完全可以出售,那么它可以按到期时间升序出售。因此,如果您按到期时间按升序排列所有苹果,则您需要对每个苹果做出的唯一决定是现在出售还是根本不出售它
这是 Python 中的一个简单的递归实现(可以很容易地记住多项式时间):
该程序还解释了必须选择哪些苹果才能最大化结果:
T(i, j) = 0 #if i>|apples|
T(i, j) = T(i+1, j) #if j/k >= rot(i)
T(i, j) = max(value(i) + T(i+1, j+1), T(i+1, j)) #if j/k < rot(i)
Run Code Online (Sandbox Code Playgroud)
这输出:
(9, [(1, 2), (2, 3), (3, 4)])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |