在这里呢,绝爵觉就直接写出满分思路代码了.
首先呢,看到这道题就是动态规划能拿满分 如果有其他的方法就是我的不严谨了。
定义一个数组f是动态规划的数组,然后状态存储四维(1有几张,二有几张,三有几张,四有几张),这就需要读入数据时有个预处理了,这都好办了,贴代码了
动态规划的主体方程见上
#include<bits/stdc++.h>
using namespace std;
int n;
int m;
int a[351];
int b[121];
int cnt[5];
int f[41][41][41][41];
int main()
{
memset(cnt,0,sizeof(cnt));
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++)
{
cin>>b[i];
cnt[b[i]]++;
}
memset(f,-0x3f,sizeof(f));//初始化
f[0][0][0][0]=a[1];//边界值
for(int i=0;i<=cnt[1];i++)
{
for(int j=0;j<=cnt[2];j++)
{
for(int k=0;k<=cnt[3];k++)
{
for(int l=0;l<=cnt[4];l++)
{
int data=i*1+j*2+k*3+l*4+1;//权值乘完加完以后一定要加一
if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+a[data]);
if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+a[data]);
if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+a[data]);
if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+a[data]);
}
}
}
}
cout<<f[cnt[1]][cnt[2]][cnt[3]][cnt[4]];
return 0;
}