#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 351; //remember to modify the range of the data!!
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
typedef long long ll;
int n, m, t;
int f[41][41][41][41]; //四种牌分别用了多少张所得分数
int a[N], b[N];
int main(void)
{
cin >> n >> m;
int s1 = 0, s2 = 0, s3 = 0, s4 = 0;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= m; i++)
{
cin >> b[i];
switch (b[i])
{
case 1:
s1++;
break;
case 2:
s2++;
break;
case 3:
s3++;
break;
case 4:
s4++;
break;
}
}
f[0][0][0][0] = a[1];
for(int i = 0; i <= s1; i++)
for(int j = 0; j <= s2; j++)
for(int k = 0; k <= s3; k++)
for(int l = 0; l <= s4; l++)
{
int now = i + 2 * j + 3 * k + 4 * l + 1;
if(i)
f[i][j][k][l] = max(f[i - 1][j][k][l] + a[now], f[i][j][k][l]);
if(j)
f[i][j][k][l] = max(f[i][j - 1][k][l] + a[now], f[i][j][k][l]);
if(k)
f[i][j][k][l] = max(f[i][j][k - 1][l] + a[now], f[i][j][k][l]);
if(l)
f[i][j][k][l] = max(f[i][j][k][l - 1] + a[now], f[i][j][k][l]);
}
cout << f[s1][s2][s3][s4];
return 0;
}
这是我抄袭参考题解写的,但是不明白是如何保证不选上次选过的卡片