复杂的动态编程,如何定义重叠的子问题

时间:2015-02-26 13:54:29

标签: algorithm dynamic-programming

制片人想雇用新工人。每个新员工都为公司带来了额外的价值。同一师中的每一位下一位工人都会获得与他之前相同或更低的价值。 E.g。

 Division #1: Division #2: ...
 0: 0         0
 1: 30        35
 2: 55        65
 3: 78        90
 4: 97        110
 5: 115       .
 6: 131       .
 7: 144       .
 8: 154
 9: 160
10: 163

制作人希望尽可能少的新工作人员为其公司增加250美元的价值。他应该如何在各部门之间分配新员工。

编辑:正如评论要求:如果你向Division #1添加0名工人,你的公司价值会增加0美元。


我需要知道如何定义子工具。

我无法应对这样一个事实:在为下一个工作人员表添加每个工作人员后,表格会发生变化。即改变了工人被放入的分部栏。因此,我不能说我有同样的问题而只需要更少的新价值。

1 个答案:

答案 0 :(得分:2)

让v(i,j)为新工人带给第i师的美元价值。这基本上是你问题中的转置表。

有n个部门,你正在寻找一系列自然数w 1 ,...,w n ,这样SUM(i = 1..n, w i )是最小的并且SUM(i = 1..n,v(i,w i ))≥250。

主要观察结果是,如果你已经为某些k分配了w i 到w k ,你不需要知道确切的分配来解决剩下的问题将w k + 1 分配给w n 的子问题。您只需要知道已经分配了多少工人以及已经添加了多少价值。您基本上可以将w i 到w k (指数级大)的可能分配空间减少到两个表示您关注的所有信息的整数值。事实上,我们甚至不关心(a =工人数量,b =值)的所有组合,只关注那些没有被其他一对(c,d)取代而c <= d和d>的组合。 = b)。

您可以将f(i,x)定义为w 1 ,..,w i 的最小工人总数,使得附加值≥x

对于x&gt;显然我们有f(0,0)= 0和f(0,x)=∞; 0.无穷大值代表不可能实现这种情况。

我们也可以证明复发

f(i + 1,x)= MIN(w = 0到∞,f(i,max(0,x - v(i + 1,w))))​​

这导致了一个简单的DP算法来计算f。

您感兴趣的函数值是f(n,250)。