使用动态规划求解最小分配
Posted
技术标签:
【中文标题】使用动态规划求解最小分配【英文标题】:Solving Minimum Allocation using Dynamic programming 【发布时间】:2018-01-21 07:26:31 【问题描述】:"allocate minimum no of pages" problem 可以使用 DP 解决吗?
给你 N 本书。每 ith 本书有 Pi 页数。 您必须将书籍分配给 M 名学生。可以有许多方法或排列来做到这一点。在每个排列中,M 个学生中的一个将被分配最大页数。在所有这些排列中,任务是找到分配给学生的最大页数是所有其他排列中最小的特定排列,并打印该最小值。
每本书将只分配给一名学生。必须为每个学生分配至少一本书。
我知道这将是未经优化的,并且二进制搜索解决方案更有效,但据我了解,这可以解决吗?如果可以,记忆步骤或临时数组将是什么以及如何以自下而上的方式分解问题来解决使用 DP 吗?
【问题讨论】:
我认为这个问题的二分搜索解决方案确实使用了记忆化,但在这种情况下它不会形成任何重叠的子问题。在每个阶段,你只是在给定的学生之间分配书籍,最后挑选出尽可能少的书籍。我认为实际上不需要在这里申请DP。 您忘记了复制和粘贴使这适用于高效 DP 的关键信息:分配给学生的书籍必须是连续的这一事实。诚然,这被埋在原始链接中有关其他内容的注释中,但仍为 -1 表示努力。 【参考方案1】:是的,可以使用动态规划来解决。
假设我们已经在s
学生中分发了第一本b
书籍,让f(b, s)
成为一个学生必须阅读的最大页数的最小值。
基本情况是f(0, 0) = 0
:没有学生,没有书籍,没有页面。
转换看起来是这样的:如果当前状态是(b, s)
,我们可以转到新状态(new_b, s + 1)
(其中new_b > b
)并将其成本设置为max(f(b, s), sum_of_pages[b + 1, new_b])
。这意味着我们将[b + 1, new_b]
范围内的所有书籍分配给下一个学生。
答案是f(N, M)
(这意味着我们已经处理了所有书籍并将它们分配给所有学生)。
这个解决方案背后的直觉如下:如果我们分配了第一本书b
,对我们来说唯一重要的是已经分配了一些书的学生人数和当前答案。这个任务看起来如何并不重要。
【讨论】:
如果我正确理解了您的解决方案,这里有一个反例:M = 2, N = 3, P = [2, 4, 3]。f(1, 1) = 2
; f(2, 1) = 6
。所以f(3, 2)
必须是max(f(2, 1), 3) = 6
或max(f(1, 1), 7) = 7
。但正确答案是 5。
@user3290797 答案是 6。组必须是连续的。你不能把 2 和 3 放在一起。
哪里说组必须是连续的?它似乎隐含在链接问题底部给出的工作示例中,但我在问题陈述中看不到任何东西表明这种约束。
@j_random_hacker 如果您打开帖子中的链接,它说群组必须连续。
好的,我现在看到了——埋在关于其他事情的“注释”中! +1 为您,无需努力复制和粘贴 + 仍然管理以忽略关键信息 = -1 此问题。【参考方案2】:
vector<vector<int>> dp;
int minpages(int n,int m,int arr[])
if(dp[n][m]!=-1) return dp[n][m];
if(n<m) return dp[n][m]=INT_MAX;
if(n==0 && m==0) return dp[n][m]=0;
if(n==0 || m==0) return dp[n][m]=INT_MAX;
int min_val=INT_MAX;
for(int j=n;j>=0;j--)
min_val=min(min_val,max(accumulate(arr+j,arr+n,0),minpages(j,m-1,arr)));
return dp[n][m]=min_val;
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于使用动态规划求解最小分配的主要内容,如果未能解决你的问题,请参考以下文章