动态规划,考虑到只有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.