糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp)

xzc 2019/4/5


试题 I: 糖果
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分

【问题描述】
  糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种口味编号 1 ∼ M。
  小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。
  幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。
  给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。

【输入格式】
  第一行包含三个整数 N、M 和 K。接下来 N 行,每行 K 个整数 T1, T2, · · · , TK,代表一包糖果的口味。

【输出格式】
一个整数表示答案。如果小明无法品尝所有口味,输出 −1。

【样例输入】

6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2

【样例输出】

2

【评测用例规模与约定】

  • 对于 30% 的评测用例,1 ≤ N ≤ 20 。
  • 对于所有评测样例,1 ≤ N ≤ 100,1 ≤ M ≤ 20,1 ≤ K ≤ 20,1 ≤ Ti ≤ M 。

思路:

  • 状态压缩,把每一包糖果看成一个集合,把这个集合用一个整数表示。
  • 这个整数的二进制形式的第i位为1表示这包糖果里有第i种糖果
  • 最多一共有2^20 = 1048576种状态
  • 用已有的状态去更新加上第i包糖果后的状态
  • 具体见代码

我的代码:

/*
Author: xzc
2019/4/5
2019第十届蓝桥杯省赛C++A组 I题糖果
前会长Y_Cl亲自帮我对拍的,AC了~
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
using namespace std;
int dp[1<<20]; //二进制状态压缩
int a[105];
int main()
{//freopen("in.txt","r",stdin);int m,n,k;while(scanf("%d%d%d",&n,&m,&k)!=EOF){set<int> v; //记录n包中所有糖果的种类数 memset(dp,0x3f,sizeof(int)*(1<<m)); //初始化 dp[0] = 0;For(i,1,n){int x = 0,y;For(j,1,k){scanf("%d",&y);--y;v.insert(y);x |= (1<<y);}a[i] = x; //x的二进制形式第i位为1代表这个集合中有第i+1种糖果 dp[x] = 1;//这种状态只需要第i包糖果1包就可以达到 }if((int)v.size()<m) //把n包唐都买了也吃不到m中糖果 {printf("-1\n");continue;}int ed = (1<<m)-1; //目标状态 For(i,1,n){For(state,0,ed){if(dp[state]>200) continue; //用已有的状态去更新加上第i包糖果后的状态 int to = a[i]|state;dp[to] = min(dp[to],1+dp[state]);}}printf("%d\n",dp[ed]); }return 0;
}

2019/4/5 12:09 1105
(好饿啊,去吃饭了~)

糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc相关推荐

  1. 2019第十届蓝桥杯国赛c++B组真题及题解

    幸运地水了个国一,应该是对了3个结果填空,2+0.5+0.5个编程大题. 此次国赛共有十个题: A~E 五个结果填空,F~J 五个编程大题. 目前并未找到标准答案,个人解法可能并不完全正确或最优,不对 ...

  2. 模拟-第十届蓝桥杯省赛C++A组-外卖店优先级

    模拟-第十届蓝桥杯省赛C++A组-外卖店优先级 题目: "饱了么"外卖系统中维护着 N 家外卖店,编号 1∼N. 每家外卖店都有一个优先级,初始时 (0 时刻) 优先级都为 0. ...

  3. 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解

    第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...

  4. 2019第十届蓝桥杯省赛总结

    第十届蓝桥杯是在郑州的河南农大龙子湖校区举办的,这是我第一次参加蓝桥杯比赛,前一天晚上在酒店住的,因为自己也不知道自己成绩能如何,所以也就一直睡不着:第二天早上九点开始比赛的,比赛时长为4个小时,下午 ...

  5. 魔术表演-第14届蓝桥杯省赛Scratch中级组真题第1题

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第136讲. 魔术表演,本题是2023年5月7日举行的 ...

  6. 神奇哈哈镜-第14届蓝桥杯省赛Scratch初级组真题第3题

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第132讲. 神奇哈哈镜,本题是2023年5月7日举行 ...

  7. 九宫格游戏-第14届蓝桥杯省赛Scratch初级组真题第5题

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第134讲. 九宫格游戏,本题是2023年5月7日举行 ...

  8. 2019第十届蓝桥杯比赛总结(B组c/c++)

    试题 A: 组队 本题总分:5 分 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示.请你计算首发阵 ...

  9. 2019第十届蓝桥杯省赛C/C++B组题解

    作为很久很久没有写过算法题的考研狗 OvO(是这样的,卑微考研),我于今年再次参加了蓝桥杯... 大家都说这次蓝桥杯简单,我也是这么觉得的(或者说是我运气好),或者说是考细节吧(虽然我也没怎么考虑细节 ...

最新文章

  1. 栈与队列9——最大值减去最小值小于或等于num的子数组的数量
  2. 2019热门JAVA面试问题
  3. 云计算技术都要学什么?教你分清公有云、私有云和混合云
  4. NSArray、NSDictionary、NSString存储、删改、遍历
  5. ai推理_人工智能推理能力问答
  6. BZOJ 1878: [SDOI2009]HH的项链( BIT )
  7. 基于JAVA+Servlet+JSP+MYSQL的航空订票系统
  8. 再见2012,你好2013,总结愿望
  9. .NET 2.0中的企业库异常处理块
  10. QT安装后编译错误怎么办?
  11. Stata软件做门槛回归模型(汉森个人主页上的代码)
  12. JAVA实现126邮箱发送及部署后发送邮箱报错问题
  13. 倪海厦天纪笔记16_倪海厦-天纪16
  14. Helm 创建一个NOTES.txt文件
  15. 编程之法-C语言应用开发与工程实践-C语言概述
  16. JSP的四大作用域及属性范围
  17. 北京市专精特新中小企业认定要求及流程,补贴60万
  18. 盘点几款还不错的企业网盘产品
  19. 东田纳西州立大学计算机排名,东田纳西州立大学的计算机专业如何?
  20. HTML5之placeholder属性

热门文章

  1. 计算机操作知识试题及答案,2016计算机信息技术操作考试题及答案
  2. 服装进销存管理软件哪个比较好用?
  3. android自定义UI模板图文详解
  4. 转载,常用RGB color
  5. python实现erp自动化_用轻流,实现ERP的自动化工作流程
  6. android 2.3 刷机,【MIUI DFY】【Android 2.3.4】 刷机教程.doc
  7. SpringCloud(3)CloudAlibaba Nacos Sentinel Seata
  8. 不是你需要中台,而是一名合格的架构师(附各中台建设PPT)
  9. mysql uuid分页优化_MySQL性能优化之分页查询优化
  10. 2022-2028年全球与中国全轮驱动(AWD)系统行业深度分析