动态规划,考虑到只有4种棋子,用F[i1,i2,i3,i4]表示数字1的卡片取了i1张,数字2的卡片取了i2张,数字3的卡片取了i3张,数字4的卡片取了i4张,可以取得最大的分数。
program tortoise;
var
f:array[-1..40,-1..40,-1..40,-1..40] of longint;
a:array[0..350] of integer;
n,m,i,j,k,l,a1,a2,a3,a4:integer;
function max(p,q:longint):longint;
begin
if p>q then max:=p
else max:=q
end;
begin
assign(input,'tortoise.in');
reset(input);
assign(output,'tortoise.out');
rewrite(output);
fillchar(a,sizeof(a),0);
fillchar(f,sizeof(f),0);
readln(n,m);
for i:=1 to n do
read(a[i]);
readln;
a1:=0;
a2:=0;
a3:=0;
a4:=0;
for i:=1 to m do
begin
read(k);
if k=1 then inc(a1)
else if k=2 then inc(a2)
else if k=3 then inc(a3)
else if k=4 then inc(a4);
end;
for i:=0 to a1 do
for j:=0 to a2 do
for k:=0 to a3 do
for l:=0 to a4 do
if (i=0) and (j=0) and (k=0) and (l=0) then f[i,j,k,l]:=a[1]
else f[i,j,k,l]:=max(max(f[i-1,j,k,l],f[i,j-1,k,l]),max(f[i,j,k-1,l],f[i,j,k,l-1]))+a[1+i+2*j+3*k+4*l];
writeln(f[a1,a2,a3,a4]);
close(input);
close(output);
end.