原题链接:https://vjudge.net/problem/UVA-10817
分类:状压DP
备注:集合的状态变化
#include<bits/stdc++.h>
using namespace std;
const int inf=1<<25;
const int maxn=125;
const int maxs=10;
int s,m,n,c[maxn],st[maxn],d[maxn][1<<maxs][1<<maxs];
int dp(int i,int s0,int s1,int s2){
if(i==m+n)return s2==(1<<s)-1?0:inf;
int& res=d[i][s1][s2];
if(res>=0)return res;
res=inf;
if(i>=m)res=dp(i+1,s0,s1,s2);
int m0=st[i]&s0, m1=st[i]&s1;
res=min(res,c[i]+dp(i+1,s0^m0,(s1^m1)|m0,s2|m1));
return res;
}
int main(void){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(~scanf("%d%d%d",&s,&m,&n)&&s){
memset(d,-1,sizeof(d));
memset(st,0,sizeof(st));
getchar();
for(int i=0;i<m+n;i++){
string line; int x;
getline(cin,line);
stringstream in(line);
in>>c[i];
while(in>>x)st[i]|=1<<(x-1);
}
if(m)printf("%d\n",dp(0,(1<<s)-1,0,0));
else{
int s0=(1<<s)-1,s1=0,s2=0;
int m0=st[0]&s0,m1=st[0]&s1;
printf("%d\n",n?min(dp(1,s0,s1,s2),dp(1,s0^m0,(s1^m1)|m0,s2|m1)):0);
}
}
return 0;
}