http://blog.youkuaiyun.com/dyx404514/article/details/15506601
http://blog.youkuaiyun.com/catalyst1314/article/details/19012251
链接里看的思路,然后写了一下午,晚上改了2个BUG....
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int map[22][10],c[10];
int cnt[1<<22][10];
int dp[1<<22];
int lef[1<<22];
int main()
{
int g,b,s,n;
while(cin>>g>>b>>s)
{
if(!g&&!b&&!s) break;
int i,j,k;
memset(c,0,sizeof(c));
memset(map,0,sizeof(map));
for(i=0;i<b;i++)
{
cin>>n;
while(n--)
{
cin>>k;
k--;
map[i][k]++;
c[k]++;
}
}
int sum=0;
for(i=0;i<g;i++)
sum+=c[i]/s;
int tot=(1<<b);
memset(cnt,0,sizeof(cnt));
memset(lef,0,sizeof(lef));
for(i=0;i<tot;i++)
{
for(j=0;j<b;j++)
{
if(!((i>>j)&1))
{
for(k=0;k<g;k++)
cnt[i][k]+=map[j][k];
}
}
for(j=0;j<g;j++){
lef[i]+=cnt[i][j]/s;
cnt[i][j]%=s;
}
lef[i]=sum-lef[i];
}
memset(dp,0,sizeof(dp));
for(i=0;i<tot;i++)
{
for(j=0;j<b;j++)
{
if((i>>j)&1)
{
int he=0,l=i-(1<<j);
for(k=0;k<g;k++)
{
he+=(cnt[i][k]+map[j][k])/s;
}
if(he)
{
dp[i]=max(dp[i],dp[l]+he);
}
else
{
dp[i]=max(dp[i],lef[i]-dp[l]);
}
}
}
}
cout<<2*dp[tot-1]-sum<<endl;
}
}