一个想通了就超级简单困难的动态规划
不翻题解想不到系列
#include<bits/stdc++.h>
using namespace std;
const int maxn=50;
int fs[500];
int four[5];
int f[maxn][maxn][maxn][maxn];//动态规划方程意思:使用1号牌,2号牌,3号牌,4号牌分别为i个,j个,k个和l个时候所获得的分数,
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>fs[i];
}
int a;
for(int i=1;i<=m;i++){
cin>>a;
four[a]++;
}
f[0][0][0][0]=fs[1];
for(int i=0;i<=four[1];i++){
for(int j=0;j<=four[2];j++){
for(int k=0;k<=four[3];k++){
for(int l=0;l<=four[4];l++){
int r=i+j*2+k*3+l*4+1;
if(i) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+fs[r]);
if(j) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+fs[r]);
if(k) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+fs[r]);
if(l) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+fs[r]);
//cout<<f[i][j][k][l]<<endl;
}
}
}
}
cout<<f[four[1]][four[2]][four[3]][four[4]]<<endl;;
return 0;
}