hdu4778 状态压缩
2015-10-15 21:11
260 查看
#include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <string.h> using namespace std; bool use[1<<22]; int dp[1<<23]; int G,B,S; int P[22][10]; int nu[10]; int work3() { int ans=0; for(int i=1; i<=G; i++) { int ge=0; for(int j=0;j <B; j++) ge+=P[j][i]; ans+=ge/S; } return ans; } int jia(int j) { int ans=0; for(int i=1; i<=G; i++) { nu[i]+=P[j][i]; ans+=nu[i]/S; nu[i]%=S; } return ans; } void jian(int j) { for(int i=1; i<=G; i++) { nu[i]=((nu[i]-P[j][i])%S+S)%S; } } void dfs(int D,int cntge) { if(use[D])return ; use[D]=true; dp[D]=0; for(int j=0;j<B; j++) { if((D&(1<<j))==0)continue; int num=jia(j); dfs(D^(1<<j),cntge-num); if(num>0) dp[D]=max(dp[D^(1<<j)]+num,dp[D]); else{ dp[D]=max(cntge-dp[D^(1<<j)],dp[D]); } jian(j); } } int main() { while(scanf("%d%d%d",&G,&B,&S)&&G+B+S!=0) { if(B==0){ printf("0\n");continue; } for(int i=0; i<B; i++) { int d; scanf("%d",&d); memset(P[i],0,sizeof(P[i])); for(int j=0;j<d; j++){ int k;scanf("%d",&k); P[i][k]++; } } int K=1<<B; memset(use,false,sizeof(use)); use[0]=true; int ge1=work3(); dfs(K-1,ge1); int ge=dp[K-1]; printf("%d\n",ge*2-ge1); } return 0; }
相关文章推荐
- EntityFramework在root目录web.config中的配置设置
- [Java Web]Web应用基本概念
- swift 2.0 字典
- 51nod 1106 质数检测 (三种模板_好题)
- linux shell用法(1)-- tee命令
- 海岸线研究流水账
- 利用颜色矩阵实现图片效果
- 车站
- Javascript基础(三)
- NSURLErrorDomain Code=-1002 “unsupported URL”
- 有两个磁盘文件 A,B 各放一行字母,要求把两文件信息合并(按字母排序),输出到C 中
- Android中activity的两种启动方式
- Yii2的urlmanager开启
- web前端学习笔记02
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- MyEclipse8.5配置整合SSH框架 简单登录验证功能
- Mybatis高级特性学习(二)
- 路书
- 初识Mybatis-Spring
- 【BeiJing2011】【BZOJ2462】矩阵模板