#include <bits/stdc++.h>
int max(int a, int b)
{
if (a > b)
return a;
return b;
}
int min(int a, int b)
{
if (a < b)
return a;
return b;
}
int f[50][50][50][50] = {-1}, n, m, map[360], card[4];
int dp(int a, int b, int c, int d)
{
if(f[a][b][c][d] == -1)
{
int ans = map[a * 1 + b * 2 + c * 3 + d * 4];
int x = 0, y = 0, z = 0, t = 0;
if(a < card[0])
x = dp(a + 1, b, c, d);
if(b < card[1])
y = dp(a, b + 1, c, d);
if(c < card[2])
z = dp(a, b, c + 1, d);
if(d < card[3])
t = dp(a, b, c, d + 1);
f[a][b][c][d] = ans + max(max(x, y), max(z, t));
}
return f[a][b][c][d];
}
int main(void)
{
memset(f, -1, sizeof(f));
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d", map + i);
for (int i = 0; i < m; i++)
{
int t;
scanf("%d", &t);
card[t - 1]++;
}
//printf("%d %d %d %d\n", card[0], card[1], card[2], card[3]);
printf("%d", dp(0, 0, 0, 0));
return 0;
}
https://www.luogu.com.cn/record/76048952编译错误,没有任何提示,本地可以通过