目录

  • 一、题目
  • 二、思路和代码
    • 2.1 bfs+小根堆+状态压缩(60)
    • 2.2dfs(40)
    • 2.3状态压缩和dp(10分)

一、题目

题目 2302: 蓝桥杯2019年第十届省赛真题-糖果
时间限制: 1Sec 内存限制: 128MB 提交: 1502 解决: 432
题目描述
糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种 口味编号 1 ∼ M。

小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售。

幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知 道每包内的糖果口味。

给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖 果。

输入
第一行包含三个整数 N、M 和 K。

接下来 N 行每行 K 这整数 T1, T2, · · · , TK,代表一包糖果的口味

(对于 30% 的评测用例,1 ≤ N ≤ 20 。

对于所有评测样例,1 ≤ N ≤ 100,1 ≤ M ≤ 20,1 ≤ K ≤ 20,1 ≤ Ti ≤ M 。)

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

样例输入

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

样例输出

2

二、思路和代码

dfs用的搜索,状态压缩和动态规划参考大佬cpp题解但最终甚至分数更低。虽然如此,状态压缩还是学到了。

2.1 bfs+小根堆+状态压缩(60)

import heapqN, M, K = [int(x) for x in input().split()]
ls = list()
ls.append([])
for _ in range(N):ls.append([int(x) for x in input().split()])# bfs
queue = list()# 返回压缩状态
def getState(pack):res = 0for x in pack:res = res | 1 << (x - 1)return res# 将糖果包转化为压缩状态
for i in range(1, N + 1):ls[i] = getState(ls[i])# 结点结构为[已尝糖果压缩状态, 下一糖果包, 已用糖果包数]
class Node:def __init__(self, x, y, z):self.data = [x, y, z]def __gt__(self, other):return self.data[2] > other.data[2]def __ge__(self, other):return self.data[2] >= other.data[2]def __lt__(self, other):return self.data[2] < other.data[2]def __le__(self, other):return self.data[2] <= other.data[2]heapq.heappush(queue, Node(0, 1, 0))
destination = pow(2, M) - 1
res = 0
while len(queue) != 0:cur = heapq.heappop(queue)data = cur.data# 若下一个已经没了,删除if data[1] == N + 1:continue# 下一个零食包加入data1 = data[0] | ls[data[1]]# 到达结果,退出if data1 == destination:res = data[2]breaktempnode = Node(data1, data[1] + 1, data[2] + 1)heapq.heappush(queue, tempnode)# 下一个零食包不加入tempnode = Node(data[0], data[1] + 1, data[2])heapq.heappush(queue, tempnode)if len(queue) == 0:print(-1)
else:print(res)

2.2dfs(40)

dfs(40分):

N, M, K = [int(x) for x in input().split()]
ls = list()
# 插入头结点,为了下标一致
ls.append([])
for _ in range(N):ls.append([int(x) for x in input().split()])# used记录第i包糖果是否买过,tasted记录已经尝过的味道,res记录最优包数
havntused = [i for i in range(N+1)]
tasted = [0 for _ in range(M+1)]
res = float("inf")# 深度优先搜索,packs记录当前买了多少包
def dfs(packs):global res, tasted# 剪枝if packs >= res:return# 尝遍if sum(tasted) == M:res = min(res, packs)returnif len(havntused) == 1:return# 遍历所有糖果包, 这个地方可以用一个链表数据结构存未买的糖果包(看看别人是怎么做的)for i in range(1, len(havntused)):# tasted0备份tasted, pack是这次要用的糖果包tasted0 = tasted[:]pack = havntused.pop(i)# 更新尝过的口味,这个地方先放着for x in ls[pack]:tasted[x] = 1dfs(packs+1)# 恢复havntused.insert(i, pack)tasted = tasted0dfs(0)
if res == float("inf"):print(-1)
else:print(res)

2.3状态压缩和dp(10分)

# 动态规划,dp[i]表示达到i状态需要的最少包数
# 动态数组下标表达的是状态,i状态的含义是:糖果的状态用一位可以表示,采用状态压缩作为dp数组下标, 设下标为j的糖果包的状态为f(j)
# 则状态转移方程为:dp[i|f(j)] = min(dp[i]+1, dp[i|f(j)])
# 更新顺序为从只需要一包,用一包的更新两包,用两包的更新三包。。。
N, M, K = [int(x) for x in input().split()]
ls = list()
for _ in range(N):ls.append([int(x) for x in input().split()])# 返回压缩状态
def getState(pack):res = 0for x in pack:res = res | 1<<(x-1)return res
# 动态数组
dp = [float("inf") for _ in range(pow(2, M))]# 初始化dp,并修改存糖果包的ls中直接存储state
for i in range(N):state = getState(ls[i])ls[i] = statedp[state] = 1# 考虑用第k个零食包
for k in range(N):# 用第k个零食包更新每个状态for j in range(pow(2, M)):if dp[j] != float("inf"):dp[j|ls[k]] = min(dp[j]+1, dp[j|ls[k]])if dp[pow(2, M)-1] == float("inf"):print(-1)
else:print(dp[pow(2, M)-1])

蓝桥杯-糖果(python,dfs,状态压缩和动态规划)相关推荐

  1. 【预览】蓝桥杯竞赛python算法笔记 代码模板|吐血总结|蓝桥杯省赛国赛

    [预览]蓝桥杯竞赛python算法笔记 代码模板|吐血总结 完整版链接 文章目录 [预览]蓝桥杯竞赛python算法笔记 代码模板|吐血总结 1 二分算法求分界值 2 双指针算法 2.1 求最长的不包 ...

  2. 【完整版】蓝桥杯竞赛python算法笔记 代码模板|吐血总结|蓝桥杯省赛国赛

    蓝桥杯竞赛python算法笔记 代码模板|吐血总结 文章目录 蓝桥杯竞赛python算法笔记 代码模板|吐血总结 1 二分 1.1 二分求最大满足(check红色条件) 1.2 二分求最小满足(che ...

  3. 关于python的比赛_【蓝桥杯】——python集团的比赛技巧,Python,组

    [蓝桥杯]-- Python组比赛技巧 蓝桥杯是大学生IT学科赛事,由工业和信息化部人才交流中心主办,所以对于大学生还说还是非常值得去参加的,2020年第十一届蓝桥杯新增了大学Python组,不分组别 ...

  4. 第十二届蓝桥杯青少年python组 第1-3题 C++实现

    蓝桥杯STEMA测评--Python真题讲解1 蓝桥杯STEMA测评--Python真题讲解1_哔哩哔哩_bilibili 蓝桥杯STEMA测评--Python真题讲解2 蓝桥杯STEMA测评--Py ...

  5. 蓝桥杯-迷宫(DFS)

    蓝桥杯-迷宫(DFS) 题目描述 X 星球的一处迷宫游乐场建在某个小山坡上.它是由 10 \times 1010×10 相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡 ...

  6. 蓝桥杯-杨辉三角形-python

    题目 可以结合目录来理解文章~ 原始方法 这个方法可以拿到40分.N数值比较大的时候,运行时间会超过限制. 思路 逐行生成杨辉三角,找到了需要的N以后就停止循环,并输出对应的位置. 变量解释 用于计算 ...

  7. 蓝桥杯笔记:DFS(深度优先搜索)解决问题

    DFS: 深度优先搜索: 访问当前的元素后,递归访问元素的邻接元素(找出所有下一步的可能元素,判断是否能访问),撤回当前元素访问 dfs(当前状态) {//递归终止条件if(当前状态==结束状态) { ...

  8. 【蓝桥杯】Python字符串处理和应用

    前言: 本文侧重于通过实战训练来提高字符串的处理能力,可以先行学习一下我之前的文章:蓝桥杯Python快速入门(4) ,学习完基础知识再来刷题才会事半功倍! 字符串处理 # 字符串切片 str1=&q ...

  9. 蓝桥杯之Python算法设计系列(二)

    目录 基础算法案例 全套资源点击此处下载 1.特殊回文数 2.特殊回文数 3.A+B案例 4.数组排序 5.序列求和 6.十六进制转八进制 7.十六进制转十进制 8.查找数字出现次数 9.水仙花 10 ...

  10. 蓝桥杯之Python算法设计系列(一)

    目录 蓝桥杯简介 什么是蓝桥杯? 大赛项目 一.个人赛软件类 二.个人赛电子类 三.青少年创意编程组 四.视觉设计大赛 Python程序设计 注意事项 Python程序语言设计-计算机二级 Pytho ...

最新文章

  1. HTTP协议中的Range和Content-Range
  2. 强大Jquery插件,table排序之二
  3. Spring Cloud和Dubbo
  4. 个人永久性免费-Excel催化剂功能第28波-工作薄瘦身,安全地减少非必要冗余
  5. python unicode转字符串_Python2.X如何将Unicode中文字符串转换成 string字符串
  6. 安装RabbitMq启动运行出现服务无法启动 发生系统错误1067解决方案
  7. lenet5卷积神经网络_tensorflow图像识别入门实战:使用LeNet5模型实现猫狗分类
  8. Android AsyncTask 详解及注意事项
  9. 985研究生组团诈骗,一个中招就关App,涉案金额超1亿,受害人遍布全国
  10. 快速图像检索(Deep Learning of Binary Hash Codes for Fast Image Retrieval)
  11. latex在行末出现百分号的作用
  12. IT战略规划与企业架构
  13. 《码农翻身》各章节阅读链接
  14. Django项目(五):注册模块—登录注册
  15. macbook或mac Apple ID 更新提示连接服务器出错
  16. 全网营销如何落地?全网营销的途径有哪些?
  17. CAD的坐标输入方式有哪些
  18. 探秘 VMware Tanzu Kubernetes 发行版
  19. 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)
  20. 项目实训2021.07.01

热门文章

  1. scipy.io.matlab.miobase.MatWriteError: Matrix too large to save with Matlab 5 format
  2. 多商户商城系统功能拆解11讲-平台端商品栏目
  3. SWUST OJ320(鸡兔同笼)
  4. 面向对象——浓缩的哲学1
  5. Delphi仿制Web的导航
  6. 期货代码_名称映射表
  7. jQuery练习t130,从0到1
  8. 基于Windows和linux下开源缺陷跟踪系统Mantis安装和安装配置手册
  9. 找到了一首曾经很喜欢的老歌
  10. 基于JavaWeb的网上购物系统的设计与实现