分析: 二维费用背包:f[i,j]表示物抗为i魔抗为j时最小的金额数。
对当前(ai,bi,mi)f[i+ai,j+bi]=min{f[i,j]+mi};
如果i+ai大于A,则将f[i+ai]更新到f[a]中去,j同理。
代码
const
maxn=100;
var
f:array[0..maxn,0..maxn] of longint;
a,b,m:array[0..maxn] of longint;
n,aa,bb,i,j,k,x,y:longint;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
begin
assign(input,'equipment.in');reset(input);
assign(output,'equipment.out');rewrite(output);
readln(aa,bb);
readln(n);
for i:=1 to n do
readln(a[i],b[i],m[i]);
for i:=0 to aa do
for j:=0 to bb do
f[i,j]:=maxlongint div 2;
f[0,0]:=0;
for i:=1 to n do
for j:=aa downto 0 do
for k:=bb downto 0 do
begin
x:=j+a[i];
y:=k+b[i];
if x>aa then x:=aa;
if y>bb then y:=bb;
f[x,y]:=min(f[x,y],f[j,k]+m[i]);
end;
writeln(f[aa,bb]);
close(input);close(output);
end.