#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int g,b,s;
int cc[30][10];
int dp[1<<21];
int dfs(int status,int num[],int lef){
//cout << status << endl;
if(lef == 0) return dp[status] = 0;
if(dp[status] != -1) return dp[status];
int tt[10];
int ans = 0;
for(int i = 0;i < b;i++){
if(!((status >> i)&1)){
int flag = (status|(1<<i));
int sum = 0;
for(int j = 1;j <= g;j++){
tt[j] = num[j] + cc[i][j];
sum += tt[j] / s;
tt[j] = tt[j] % s;
}
int q = 0;
if(sum){
q = sum + dfs(flag,tt,lef-sum);
//cout << status << " " << "1" << " "<< q << endl;
}
else{
q = lef - dfs(flag,tt,lef);
//cout << status << " " << flag << " " << "2" << " "<< q << endl;
}
//cout << q << endl;
ans = max(ans,q);
}
}
return dp[status] = ans;
}
int main(){
while(cin >>g>>b>>s,g||b||s){
memset(dp,-1,sizeof(dp));
memset(cc,0,sizeof(cc));
int d[10] = {0};
for(int i = 0;i < b;i++){
int c;
scanf("%d",&c);
for(int j = 0;j < c;j++){
int x;
scanf("%d",&x);
cc[i][x]++;
d[x] ++;
}
}
int all = 0;
for(int i = 1;i <= g;i++){
all += d[i]/s;
}
//cout << all <<endl;
int tt[10] = {0};
int q = dfs(0,tt,all);
//cout << q << endl;
cout << q - all + q << endl;
}
return 0;
}
hdu4778状态压缩dp 博弈
最新推荐文章于 2019-03-18 20:48:45 发布