转自wdd :http://blog.csdn.net/u010535824/article/details/38540835

题目链接:hdu 4778

状压DP

用DP[i]表示从i状态选到结束得到的最大值

代码也来自wdd

 1 /******************************************************
 2  * File Name:   b.cpp
 3  * Author:      kojimai
 4  * Creater Time:2014年08月13日 星期三 11时42分53秒
 5 ******************************************************/
 6 /*
 7  *有g种颜色的宝石,在一个容器中每s个同色宝石可以合成一个魔法石,给你b个包,里面有一定数目的宝石。
 8  *两人博弈,每个人每个回合把一个包中的所有的宝石放进容器中,如果该操作能得到一个魔法石,则能再进行一次操作
 9  *两个人都采取最有策略,问最终先手得到的魔法石与后手得到的魔法石的差值为多少
10
11  *状压DP,dp[i]表示i状态为起始,选到结束能得到的最大值
12  *i&(1<<j)==0 表示当前状态下j已经选过了
13  *i&(1<<j)==1 表示当前状态下j可选,转移方程:
14  **dp[i]=max(dp[i],dp[i^(1<<j)]+cnt) 在i^(1<<j)状态下选j能得到cnt个魔法石
15  **dp[i]=max(dp[i],-dp[i^(1<<j)])    选了j之后得不到魔法石
16 */
17 #include<cstdio>
18 #include<cstring>
19 #include<cmath>
20 #include<algorithm>
21 #include<iostream>
22 using namespace std;
23 #define FFF -23333333
24 int gem[22][9];//每个包中的宝石
25 int now[9];//当前状态每种宝石的数目
26 int dp[1<<21];//1表示还剩哪些位可以选,0表示该位已经选了,在该状态下一直选到结束的最大情况
27 int main()
28 {
29     int g,b,s;
30     while(cin>>g>>b>>s)//g-colornum b-bag s-least
31     {
32         if(g+b+s==0)
33             break;
34         memset(gem,0,sizeof(gem));
35         for(int i=0;i<b;i++)
36         {
37             int x,y;
38             scanf("%d",&x);
39             for(int j=0;j<x;j++)//读取每个包中的宝石数
40             {
41                 scanf("%d",&y);
42                 gem[i][y]++;
43             }
44         }
45         int all=(1<<b);
46         dp[0]=0;
47         for(int i=1;i<all;i++)
48         {
49             dp[i]=FFF;
50             memset(now,0,sizeof(now));
51             for(int j=0;j<b;j++)
52             {
53                 if((i&(1<<j))==0)//当前i状态中j不可选,即之前j已经选过了,统计出所有已经选过的点得到的当前剩余的宝石
54                 {
55                     for(int k=1;k<=g;k++)
56                     {
57                         now[k]=(now[k]+gem[j][k])%s;
58                     }
59                 }
60             }
61         /*    cout<<"i="<<i<<":"<<endl;
62             for(int j=1;j<=g;j++)
63                 cout<<now[j]<<' ';
64         */    int cnt=0;
65             for(int j=0;j<b;j++)
66             {
67                 if((i&(1<<j))!=0)
68                 {
69                     cnt=0;
70                     for(int k=1;k<=g;k++)
71                     {
72                         int t=now[k]+gem[j][k];
73                         cnt+=t/s;
74                     }
75                     //cout<<"j="<<j<<"  cnt="<<cnt<<endl;
76                     if(cnt)
77                         dp[i]=max(dp[i],cnt+dp[i^(1<<j)]);
78                     else
79                         dp[i]=max(dp[i],-dp[i^(1<<j)]);
80                 }
81             }
82             //cout<<"i="<<i<<" dp="<<dp[i]<<endl;
83         }
84         cout<<dp[all-1]<<endl;
85     }
86     return 0;
87 }

转载于:https://www.cnblogs.com/njczy2010/p/3935650.html

hdu 4778 Gems Fight! 状压dp相关推荐

  1. HDU 3001 三进制状压DP

    HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...

  2. Tunnels HDU - 4856 (bfs状压dp)

    Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...

  3. Hdu 4856 Tunnels(状压dp)

    题目链接 Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  4. HDU - 4856 Tunnels(哈密顿路径+状压dp)

    题目链接:点击查看 题目大意:给出一个n*n的正方形网格,其中"."表示可以走的路,"#"表示障碍物,每次可以向上下左右任意方向走1格,花费1单位时间,再给出m ...

  5. hdu 4049 Tourism Planning [ 状压dp ]

    传送门 Tourism Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

  7. HDU 5691 Sitting in Line 状压dp

    Sitting in Line 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 Description 度度熊是他同时代中最伟大的数学家,一切 ...

  8. 【HDU - 2809】 God of War(状压dp)

    题干: At 184~280 A.D ,there were many kingdoms in China. Three strongest among them are "Wei" ...

  9. hdu 6149 Valley Numer II(01背包套状压dp)

    题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...

最新文章

  1. SQLite的数据类型总结
  2. pycharm替换和查找文件中所有相同代码方法
  3. 实训总结_实训总结汇报!
  4. 安卓应用部件_设计应用程序小部件的痛苦和喜悦
  5. javascript 相关小的知识点集合
  6. linux下c标准库位置,C 标准库 IO 使用详解
  7. 程序员谈谈我的职场观(一)
  8. 有规律的进行效果最好--打扫有感
  9. 英特尔中国:截至2018年底女性员工占比33%
  10. 使用纯生js实现图片轮换
  11. 使用Jquery对数组进行迭代、排序、去重! 美男子加油!!!
  12. SSD 超详细入门(代码+原文)
  13. 分享 100 道基础的前端面试题(附答案)
  14. ESXI 通过naa在主机上找到物理磁盘的位置
  15. [cadfil] 基于隐形飞机喷气式发动机双S弯喷管的纤维缠绕工艺
  16. tomcat的startup.bat启动成功了,但是页面加载不了
  17. EasyX入门和介绍
  18. 使用联想计算节点的方法整理
  19. 2023年报考CSM敏捷教练认证好不好?含金量高吗?
  20. 区块链技术应用大盘点(涵盖金融、医疗、政务等领域)

热门文章

  1. STL 简介,标准模板库
  2. 火铃游戏Java_敲铃的小班游戏教案
  3. matplotlib中文文档_python绘图库——Matplotlib及Seaborn使用(入门篇1)
  4. java中日期的数据类型是啥_用于存储日期和时间的最合适的SQL和Java数据类型
  5. 实战讲解Python函数参数
  6. .ne中的控制器循环出来的数据如何显示在视图上_Web程序设计-ASP.NET MVC4数据库操作实例...
  7. C++中的Socket编程使用协议发送图片
  8. Codeforces Round #686 (Div. 3) F. Array Partition(二分+线段树)
  9. 2020 ACM / ICPC 济南 A Matrix Equation (高斯消元、乘法原理)
  10. 在html中加入评论,在自己网页中引入Valine评论