制片人想雇用新工人。每个新员工都为公司带来了额外的价值。同一师中的每一位下一位工人都会获得与他之前相同或更低的价值。 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美元。
我需要知道如何定义子工具。
我无法应对这样一个事实:在为下一个工作人员表添加每个工作人员后,表格会发生变化。即改变了工人被放入的分部栏。因此,我不能说我有同样的问题而只需要更少的新价值。
答案 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)。