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
  • 相关阅读:
    汽车金融评分卡
    Lending Club 数据做数据分析&评分卡
    时间序列分析和预测 (转载)
    距离计算公式总结(转载)
    机器学习常用算法与辅助函数公式
    金融领域常用的数据分析方法
    常用模型评估方法总结
    A--集成算法的实现
    A--随机森林(RF)的 sciklit-learn 实现
    A--Scikit-Learn 实现决策树
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13261027.html
Copyright © 2011-2022 走看看