我最慢一个点跑了40ms
#include<bits/stdc++.h>
using namespace std;
int m,n;
int w[355],l[355],b[6],jyh[42][42][42][42];
void in()
{
int x;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%d",&l[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
++b[x];
}
}
int dp(int m,int a1,int b1,int c1,int d1)
{
if(jyh[a1][b1][c1][d1]!=0)
return jyh[a1][b1][c1][d1];
int a=0,b=0,c=0,d=0;
if(a1>0)
a=dp(m-1,a1-1,b1,c1,d1);
if(b1>0)
b=dp(m-2,a1,b1-1,c1,d1);
if(c1>0)
c=dp(m-3,a1,b1,c1-1,d1);
if(d1>0)
d=dp(m-4,a1,b1,c1,d1-1);
return jyh[a1][b1][c1][d1]=max(a,max(b,max(c,d)))+l[m];
}
int main()
{
in();
printf("%d",dp(m,b[1],b[2],b[3],b[4]));
return 0;
}