数组f[i-1,k]表示前i-1给公司分配k台机器的最大盈利(1 \leq i \leq n,1 \leq j \leq m,0 \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.
```