以下代码时间复杂度为O(1100*m^3),但开O2可以通过本题
# include <bits/stdc++.h>
using namespace std;
int n,m,k,c;
int a[100005],b[100005],f[105][105][2005],p[1005],q[1005],v[1005],w[10005];//前i场,看j,小红=k时小明最大值
int main(){
cin>>n>>m>>k>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=m;i++){
cin>>p[i]>>q[i];
v[i]=a[p[i]]*a[q[i]];
w[i]=b[p[i]]+b[q[i]];
}
memset(f,-0x3f,sizeof(f));
for(int i=1;i<=m;i++){
f[i][1][w[i]]=v[i];
f[i][0][0]=0;
}
for(int i=1;i<=m;i++){
for(int j=0;j<=min(k,i);j++){
for(int k=0;k<=1100;k++){
for(int l=i+1;l<=m;l++){
f[l][j+1][k+w[l]]=max(f[l][j+1][k+w[l]],f[i][j][k]+v[l]);
f[l][j][k]=max(f[l][j][k],f[i][j][k]);
}
}
}
}
// for(int i=1;i<=m;i++){
// for(int j=0;j<=min(k,i);j++){
// for(int k=0;k<=c+20;k++){
// cout<<i<<" "<<j<<" "<<k<<" "<<f[i][j][k]<<endl;
// }
// }
// }
int ans=-1;
for(int j=c;j<=2000;j++){
ans=max(ans,f[m][k][j]);
// cout<<f[m][k][j]<<endl;
}
if(ans<=-1){
cout<<-1;
}
else
cout<<ans;
return 0;
}
刚学OI1秒的蒟蒻求大佬指点,还是本来就让过?