/*dp[num1][num2][num3][num4]代表用了多少张各种卡片所能获得的最大利益*、
/*动态转移方程dp[num1][num2][num3][num4]=max{max(
dp[num1-1][num2][num3][num4]
dp[num1][num2-1][num3][num4]
dp[num1][num2][num3-1][num4]
dp[num1][num2][num3][num4-1]
)+map[1+num1+2*num2+3*num3+num4*4],dp[num1][num2][num3][num4]}
#include<iostream> #include<algorithm> using namespace std; const int N=351,M=41; int map[N],dp[M][M][M][M]; int main() {     int  n,m,a,b,c,d,number[5]={0};     cin>>n>>m;     for(int i=1;i<=n;i++)     cin>>map[i];     for(int j=1;j<=m;j++)     {         int w;cin>>w;         switch(w)         {             case 1 : number[1]++;break;             case 2 : number[2]++;break;             case 3 : number[3]++;break;             case 4 : number[4]++;break;         }     }     dp[0][0][0][0]=map[1];     for(a=0;a<=number[1];a++)      for(b=0;b<=number[2];b++)       for(c=0;c<=number[3];c++)        for(d=0;d<=number[4];d++)        {            int start=1;            start+=a+b*2+c*3+d*4;            if(a>=1)            dp[a][b][c][d]=max(dp[a-1][b][c][d]+map[start],dp[a][b][c][d]);                if(b>=1)            dp[a][b][c][d]=max(dp[a][b-1][c][d]+map[start],dp[a][b][c][d]);                if(c>=1)            dp[a][b][c][d]=max(dp[a][b][c-1][d]+map[start],dp[a][b][c][d]);               if(d>=1)            dp[a][b][c][d]=max(dp[a][b][c][d-1]+map[start],dp[a][b][c][d]);            }     cout<<dp[number[1]][number[2]][number[3]][number[4]];     return 0; }