zoukankan      html  css  js  c++  java
  • 分组背包每组至少选一个问题

    #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
  • 相关阅读:
    iperf简单说明
    计算后图像大小参数计算
    ipywidgets安装报错
    Cannot uninstall [pacakage]. It is a distutils installed project
    torch
    es-centos7安装注意细节
    jupyter 指定特定的环境
    未来方向
    深度学习过拟合处理
    归一化
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13261027.html
Copyright © 2011-2022 走看看