zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 南京赛区网络预赛 E. AC Challenge (状压DP)

    题目:https://nanti.jisuanke.com/t/A1951

    题意:给你n个项目,每个项目有两个属性,a,b,如果第t个来完成第i个项目,那么价值就要加 t*a+b,每个项目还说了自己的先修项目,项目可以不做完,然后求出最大值

    思路:首先n只有20,我们又要考虑不同的选择情况下的最大值,很明显是个状压DP,我们dp[n],代表n状态下的最大值,这里我们枚举每个状态的时候,我们枚举当前二进制位1,代表当前选择这个结尾,然后前面的状态+当前来取最大值,故状态其实就是选择这几件物品的最大值是多少,我们判断以当前结尾的时候,我们还要判断当前状态是否都有自己的先修项目,如果有才可以,然后还要考虑当前状态是否可用的问题,每当我们有状态更新的时候就标记当前状态可以用作递推后面来使用

    #include<bits/stdc++.h>
    #define maxn 25
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    struct sss{
        ll x,y,num;
        ll b[maxn];
    }a[maxn];
    ll dp[1<<20];
    int vis[1<<20];
    int main(){
        ll n;
        scanf("%lld",&n);
        for(int i=0;i<n;i++){
            scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].num);
            for(int j=0;j<a[i].num;j++){
                scanf("%lld",&a[i].b[j]);
            }
        }
        /*for(int i=1;i<(1<<n);i++){
            dp[i]=-mod*20;
        }*/
        ll mx=0; 
        vis[0]=1;
        for(int i=1;i<(1<<n);i++){
            for(int j=0;j<n;j++){
                if((i>>j)&1){//判断是否有当前项目,如果有就假设以当前项目结尾
                    int flag=0;
                    for(int k=0;k<a[j].num;k++){//枚举先修项目
                        if((i>>(a[j].b[k]-1))&1) continue;
                        flag=1;
                        break; 
                    } 
                    int sl=0;
                    ll z=i;
                    while(z){
                        sl+=z%2;
                        z/=2;
                    }
                    if(flag==0&&vis[i^(1<<j)]){
                        vis[i]=1;
                        dp[i]=max(dp[i],dp[i^(1<<j)]+sl*a[j].x+a[j].y);
                        mx=max(mx,dp[i]);
                        //if(dp[i]==75)cout<<i<<endl;
                    }
                } 
            }
        }
        //cout<<dp[1]<<"
    ";
        cout<<mx;
    }
  • 相关阅读:
    PHP siege 压测 QPS大小
    macOs 使用Homebrew升级到MySQL 8系列之后,php无法连接解决方法
    Nginx无法加载.woff .eot .svg .ttf等解决办法
    layer 点击弹出图片
    glusterFS系统中文管理手册(转载)
    Linux 命令行总结
    linux /proc/meminfo 文件分析(转载)
    每秒执行一个shell脚本(转载)
    python SMTP邮件发送(转载)
    Python XML解析(转载)
  • 原文地址:https://www.cnblogs.com/Lis-/p/11408780.html
Copyright © 2011-2022 走看看