ACM-ICPC 2018 南京赛区网络预赛 E

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36651153/article/details/82315107

代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
long long dp[1<<20];
int bit[25],n,a[25],b[25],v[25],p[25];
int gt(int v)
{
    int ans=0;
    while(v) {
        if(v%2==1) {
            ans++;
        }
        v/=2;
    }
    return ans+1;
}
int main()
{
    bit[1]=1;
    for(int i=2;i<25;i++) {
        bit[i]=bit[i-1]*2;
    }
    scanf("%d",&n);
    for(int i=0;i<n;i++) {
        scanf("%d%d%d",&a[i],&b[i],&p[i]);
        v[i]=0;
        for(int j=0;j<p[i];j++) {
            int temp;
            scanf("%d",&temp);
            v[i]+=bit[temp];
        }
    }
    memset(dp,-1,sizeof(dp));
    dp[0]=0;
    long long ans=0;
    for(int i=0;i<=bit[n+1]-1;i++) {
        if(dp[i]==-1) continue;
        ans=max(ans,dp[i]);
        for(int j=0;j<n;j++) {
            if(i&bit[j+1]) continue;
            if((i&v[j])!=v[j]) continue;
            dp[i|bit[j+1]]=max(dp[i|bit[j+1]],dp[i]+1ll*a[j]*gt(i)+b[j]);
        }
    }
    printf("%lld\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_36651153/article/details/82315107