此题一看就知道是dp,我们设状态为f[i1,i2,i3,i4],那么这个状态可推出f[i1-1,i2,i3,i4],f[i1,i2-1,i3,i4],f[i1,i2,i3-1,i4],f[i1,i2,i3,i4-1]。 具体代码如下 var a:array[0..40,0..40,0..40,0..40]of longint; score:array[1..350]of longint; i,h,n,m,l,len,j1,j2,j3,j4:longint; sum,k:array[1..4]of longint; procedure max(var x:longint;y:longint); begin if x<y then x:=y; end; begin assign(input,'tortoise.in');reset(input); assign(output,'tortoise.out');rewrite(output); readln(n,m); for i:=1 to n do read(score[i]); readln; fillchar(sum,sizeof(sum),0); for i:=1 to m do begin read(h); inc(sum[h]); end; fillchar(a,sizeof(a),0); a[sum[1],sum[2],sum[3],sum[4]]:=score[1]; for j1:=sum[1] downto 0 do for j2:=sum[2] downto 0 do for j3:=sum[3] downto 0 do for j4:=sum[4] downto 0 do begin k[1]:=j1;k[2]:=j2;k[3]:=j3;k[4]:=j4; len:=1; for l:=1 to 4 do inc(len,l*(sum[l]-k[l])); for l:=1 to 4 do if k[l]<>0 then begin dec(k[l]); max(a[k[1],k[2],k[3],k[4]],a[j1,j2,j3,j4]+score[len+l]); inc(k[l]); end; end; writeln(a[0,0,0,0]); close(input); close(output); end.