![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #include<stack> #include<cstring> using namespace std; typedef long long ll; const int N=2e5+10; const int mod=1e9+7; int f[3][5010]; int a[N],b[N],val1[N],val2[N]; int main(){ int k,n,m; cin>>k>>n>>m; int i; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) cin>>val1[i]; for(i=1;i<=m;i++) cin>>b[i]; for(i=1;i<=m;i++) cin>>val2[i]; int ans; int res=0; int sign=0; for(i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int x=a[i]; int y=b[j]; if(x+y<=k){ memset(f,-1,sizeof f); for(int u=1;u<=k;u++) f[0][u]=0; ans=val1[i]+val2[j]; int tmp=k; k-=(x+y); for(int len=1;len<=2;len++){ if(len==1){ for(int l=1;l<=n;l++){ if(l==i) continue; for(int v=k;v>=a[l];v--){ if(f[len][v-a[l]]!=-1) f[len][v]=max(f[len][v],f[len][v-a[l]]+val1[l]); if(f[len-1][v-a[l]]!=-1 ) f[len][v] = max(f[len][v],f[len-1][v-a[l]]+val1[l]); } } } else{ for(int l=1;l<=m;l++){ if(l==j) continue; for(int v=k;v>=b[l];v--){ if(f[len][v-b[l]]!=-1) f[len][v]=max(f[len][v],f[len][v-b[l]]+val2[l]); if(f[len-1][v-b[l]]!=-1) f[len][v]=max(f[len][v],f[len-1][v-b[l]]+val2[l]); } } } } if(f[2][k]!=-1){ //cout<<ans<<" "<<f[2][k]<<" "<<k<<endl; sign=1; ans+=f[2][k]; res=max(res,ans); } k=tmp; } } } if(sign){ cout<<"YES"<<endl; cout<<res<<endl; } else{ cout<<"NO"<<endl; } }