题目链接如下
这是一道dp水题
状态转移函数包含在代码中
#include <bits/stdc++.h>
#define LL long long
#define MAXN 45
using namespace std;
int n,m;
int f[MAXN][MAXN][MAXN][MAXN];
int a[355],b[125];
int x[5];
int main() {
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d",a+i);
for(int i = 1; i <= m; i++) {
scanf("%d",b+i);
x[b[i]]++;
}
for(int i = 0; i <= x[1]; i++) {
for(int j= 0; j <= x[2]; j++) {
for(int p = 0; p <= x[3]; p++) {
for(int q = 0; q <= x[4]; q++) {
int sum = i * 1 + j * 2 + p * 3 + q * 4+1;
f[i][j][p][q] = max(i >= 1? (f[i-1][j][p][q]+a[sum]):a[1],f[i][j][p][q]);
f[i][j][p][q] = max(j >= 1? (f[i][j-1][p][q]+a[sum]):a[1],f[i][j][p][q]);
f[i][j][p][q] = max(p >= 1? (f[i][j][p-1][q]+a[sum]):a[1],f[i][j][p][q]);
f[i][j][p][q] = max(q >= 1? (f[i][j][p][q-1]+a[sum]):a[1],f[i][j][p][q]);
}
}
}
}
cout << f[x[1]][x[2]][x[3]][x[4]];
return 0;
}