分组背包每组至少选一个问题

#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;
    }
}
View Code

 

posted @ 2020-07-07 15:21  朝暮不思  阅读(293)  评论(0编辑  收藏  举报