版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}