题解 P2066 【机器分配】

· · 题解

此题是DP的经典题。

题意剖析:

按照公司的顺序来分配机器,即按照公司的顺序划分阶段,

第一个阶段把M台设备分给第一给公司,记录下来获得的盈利值,

然后再把M台设备分给前两个公司,和第一个阶段比较记录下来的更优的各个盈利值,

一直到第N个阶段吧M台机器全都分给了N个公司,就可以得到最优解,

下面来讨论两个阶段之间的关系,

设数组f[i,j]表示前i个公司分配j台机器的最大盈利,

数组f[i-1,k]表示前i-1给公司分配k台机器的最大盈利(1 \leq i \leq n1 \leq j \leq m0 \leq k \leq j)

value[i,j]表示第i给公司分配j台机器的盈利,f[i,j]可以由下面的式子取最大值获得:

$f$[$i$-$1$,$1$]+$value$[$i$,$j$-$1$]//前$i$-$1$公司分配$1$台机器最大盈利+第$i$个公司分配$j$-$1$台机器的盈利 $f$[$i$-$1$,$2$]+$value$[$i$,$j$-$2$]//前$i$-$1$公司分配$2$台机器最大盈利+第$i$个公司分配$j$-$2$台机器的盈利 $f$[$i$-$1$,$j$-$1$]+$value$[$i$,$1$]//前$i$-$1$公司分配$j$-$1$台机器最大盈利+第$i$个公司分配$1$台机器的盈利 $f$[$i$-$1$,$j$]+$value$[$i$,$0$]//前$i$-$1$公司分配$j$台机器最大盈利+第$i$个公司分配$0$台机器的盈利 这用机器数用作每个阶段的状态, 由于$value$[$i$,$j$]的值为定值,要使前面每个式子的值最大, 就必须使第$i$-$1$阶段的各个状态的值最大,阶段$i$的状态只能由阶段$i$-$1$中的状态通过状态转移方程求得,与其他状态没有关系。 由此可见,该问题具备了最优子节构和无后效性原则,适宜用动态程序方法求解, 状态转移方程$f$[$i$,$j$]=$max${$f$[$i$-$1$,$k$]+$value$[$i$,$j$-$k$]} ($1 \leq i \leq n$,$1 \leq j \leq m$,$0 \leq k \leq j$) ### Code ``` var n,m:longint; i,j,k,max:longint; f,value:array[0..10,0..15] of longint; procedure show(i,j:longint); var k:longint; begin if i=0 then exit; for k:=0 to j do if max=f[i-1,k]+value[i,j-k] then begin max:=f[i-1,k]; show(i-1,k); writeln(i,' ',j-k); exit; end; end; begin readln(n,m); for i:=1 to n do for j:=1 to m do read(value[i,j]); for i:=1 to n do for j:=1 to m do begin max:=0; for k:=0 to j do if f[i-1,k]+value[i,j-k]>max then max:=f[i-1,k]+value[i,j-k]; f[i,j]:=max; end; writeln(f[n,m]); show(n,m); end. ```