[蓝桥杯 2019 省 A] 糖果

一.题目

题目描述

糖果店的老板一共有 M 种口味的糖果出售。

为了方便描述,我们将 M 种口味编号 1∼M

小明希望能品尝到所有口味的糖果。

遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。

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

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

输入格式

第一行包含三个整数 N,M,K

接下来 N 行每行 K 个整数 T 1 , T 2 , ⋅ ⋅ ⋅ , T K T_1,T_2,⋅⋅⋅,T_K T1,T2,,TK,代表一包糖果的口味。

输出格式

一个整数表示答案。

如果小明无法品尝所有口味,输出 −1

数据范围

1 ≤ N ≤ 100,
1 ≤ M , K ≤ 20,
1 ≤ T i T_i Ti ≤ M

输入样例

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

输出样例

2

二.解释

看完题目,首先想到的是直接暴力,我们有 N 包糖果,每包糖果都有选和不选两种状态,写循环显然不可能,那用递归,每重递归处理某包糖果的两种情况。N 包就有 N 重递归,包含大量重复计算,复杂度太高,只能解部分样例。

在判断每包糖果的选与不选的时候,都是基于之前已经处理的情况来决定:

1.当前面的的某种选择情况已经包含这包糖果的所有口味,自然不用选择;

2.当前面的的某种选择情况没有包含这包糖果的所有口味:

设之前已经包含的所有口味为集合 A,当前糖果所有口味为集合 B,这是我们只需要比较之前包含**(A U B)**口味的糖果包数量和集合 A 选择的糖果包数量 + 1的较小值。

此时我们可以用DP的方法来做,对于每种口味,我们用一个位来表示选(1)与不选(0):
设有 DP 数组,对于下表 ii 的二进制位的前 N 位表示 N 包糖果的状态;

则有DP[i]:口味包含情况为 i 所需的最小糖果包数量。

三.代码

1.暴力递归:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <set>using namespace std;const int MaxN = 110;int InN, InM, InK, Res = 0x3f3f3f3f;	//糖果包总数,口味总数,每包的口味数
unordered_map<int, int> Map[MaxN];		//记录已经包含的口味void Get(int InI, int InC, unordered_map<int, int> InH)
{if (InH.size() == InM){Res = min(Res, InC);return;}if (InI > InN){if (InH.size() == InM){Res = min(Res, InC);}return;}//不选Get(InI + 1, InC, InH);//选unordered_map<int, int> Tmp = InH;InH.insert(Map[InI].begin(), Map[InI].end());	//把这包糖果的口味加到集合Get(InI + 1, InC + 1, InH);//回溯InH = Tmp;
}int main()
{cin >> InN >> InM >> InK;int a;for (int i = 1; i <= InN; i++){for (int j = 1; j <= InK; j++) { scanf("%d", &a); Map[i][a]++; }}unordered_map<int, int> InH;Get(1, 0, InH);cout << Res;return 0;
}
2.DP:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <set>using namespace std;const int MaxN = 110;int InN, InM, InK, Res = 0x3f3f3f3f;	//糖果包总数,口味总数,每包的口味数
int Ns[MaxN];							//记录每包糖果包含的口味
int DP[1 << 21];						//最多20种口味,最少需要20位。多开一个保险,记录包含口味的最小包数int main()
{cin >> InN >> InM >> InK;int a;for (int i = 1; i <= InN; i++){//使用按位或(|),记录口味for (int j = 1; j <= InK; j++) { scanf("%d", &a); Ns[i] |= 1 << (a - 1); }}memset(DP, 0x3f, sizeof DP);DP[0] = 0;for (int i = 1; i <= InN; i++){for (int j = 0; j <= 1 << InM; j++){//大于N买不到所有口味,跳过if (DP[j] > InN) continue;//已经有j口味,或上Ns[i]表示加上这包糖果的口味DP[j | Ns[i]] = min(DP[j | Ns[i]], DP[j] + 1);}}//以5种口味为例,1 << 5为100000,减一后为11111,表示物种口味全选//当包含所有口味的包数大于N的时候返回-1,否则直接返回结果if (DP[(1 << InM) - 1] > InN) { cout << -1; }else { cout << DP[(1 << InM) - 1]; }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案

大纲 几何结构构建点点集合线线集合面面集合几何信息集合 TypeHandlerSQL操作写入操作读取操作完整XML Mapper测试代码建表SQL总结代码参考资料 WKT全称是Well-Known Text。它是一种表达几何信息的字符串内容。比如点可以用WKT表示为POINT (3 3)&#xff1b;线可以用WKT表示为L…

Playwright教程

Playwright简介 支持多数浏览器 在Chromium&#xff0c;Firefox和WebKit上进行测试。Playwright拥有适用于所有现代浏览器的完整API覆盖&#xff0c;包括Google Chrome和Microsoft Edge&#xff08;带有Chromium&#xff09;&#xff0c;Apple Safari&#xff08;带有WebKit&a…

【哈希映射 字符串 乘法原理】2227. 加密解密字符串

本文涉及知识点 哈希映射 字符串 乘法原理 LeetCode 2227. 加密解密字符串 给你一个字符数组 keys &#xff0c;由若干 互不相同 的字符组成。还有一个字符串数组 values &#xff0c;内含若干长度为 2 的字符串。另给你一个字符串数组 dictionary &#xff0c;包含解密后所…

SpringCloud微服务03-微服务保护-分布式事务-MQ基础-MQ高级

一、微服务保护 1.雪崩问题 如何做好后备方案就是后续&#xff1a; 2.雪崩解决方案 某一个服务的线程是固定的&#xff0c;出现故障线程占满后&#xff0c;就不会让取调用这个服务&#xff0c;对其他服务就没有影响。 3.Sentinel ①初识Sentinel 配置过程&#xff1a;day05-服…

zookeeper的Shell操作命令

create操作 作⽤ : 创建⼀个节点&#xff0c;可以设置节点的初始内容 选项 : -e: 设置短暂类型节点 -s: 设置顺序节点 示例 : create /test 创建持久化节点 create /test2 "content message" 创建带初始化内容的持久化节点 create -e /test3 "content…

C++之多态详解

1. 多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&a…

源码编译安装LAMP

目录 1.LAMP概述 2.编译安装Apache httpd服务 1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别 6.添…

数据清洗(ETL)案例实操

文章目录 数据清洗&#xff08;ETL&#xff09;概述案例需求和分析代码实现和结果分析 数据清洗&#xff08;ETL&#xff09;概述 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&…

查询一个字符串在另一个字符串中出现的次数(java)

查询一个字符串在另一个字符串中出现的次数 例&#xff1a; String str1“helloworld,java,python,hellokafka,world big table helloteacher”; String str2“hello”; 字符串str2在str1中出现3次 代码 package exercise.test8;public class Demo8 {public static void mai…

Python中的Lambda函数:轻量级匿名函数的魅力

Python中的Lambda函数&#xff1a;轻量级匿名函数的魅力 一、引言 在Python编程中&#xff0c;lambda函数是一种简洁、轻量级的匿名函数&#xff0c;也称为“lambda表达式”或“lambda函数体”。它允许我们定义一个简单的函数&#xff0c;而无需使用def关键字进行完整的函数定…

【网络安全】2030年十大新兴网络安全威胁

欧盟网络安全局&#xff08;ENISA&#xff09;已发布了一份全面的清单&#xff0c;列出了预计到2030年将影响数字领域的十大新兴网络安全威胁。 该预测是为期八个月的广泛研究的成果&#xff0c;融合了ENISA前瞻专家小组、CSIRTs网络以及欧盟CyCLONe专家的见解。 这项研究突显…

[技术报告]InternLM2 Technical Report

摘要 像ChatGPT和GPT-4这样的大型语言模型&#xff08;llm&#xff09;的进化引发了人们对人工通用智能&#xff08;AGI&#xff09;出现的讨论。然而&#xff0c;在开源模型中复制这种进步一直是一个挑战。本文介绍了InternLM2&#xff0c;这是一个开源的大语言模型&#xff…

【面试干货】矩阵对角线元素之和

【面试干货】矩阵对角线元素之和 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 创建一个3x3的二维数组来表示输入的矩阵。通过嵌套循环读取输入的矩阵元素&#xff0c;并将其保存到数组中。再次嵌套循…

揭秘齿轮加工工艺的选用原则:精准打造高效传动的秘密武器

在机械制造领域&#xff0c;齿轮作为传动系统中的重要组成部分&#xff0c;其加工工艺的选择至关重要。不同的齿轮加工工艺会影响齿轮的精度、耐用性和效率。本文将通过递进式结构&#xff0c;深入探讨齿轮加工工艺的选用原则&#xff0c;带您了解如何精准打造高效传动的秘密武…

Web应用防火墙的重要性

网络安全是一个永恒的话题&#xff0c;尤其是在未知威胁不断涌现的情况下。企业网络安全是保障业务稳定运行的基础&#xff0c;Web应用防火墙(WAF)是企业网络安全的重要屏障&#xff0c;其性能直接影响到网络服务的质量和安全。 Web应用防火墙是什么&#xff1f; Web应用防火墙…

试试这个自动备份工具!

需要定时备份数据&#xff01; 在这个科技迅速发展的时代&#xff0c;数据安全变得极为重要。作为普通用户&#xff0c;我们需要了解数据备份的重要性。数据备份就像一把保护我们的伞&#xff0c;让我们不用担心重要文件意外丢失带来的困扰。如果我们忽视数据备份&#xff0c;…

SpringIOCDI—第一讲

文章目录 什么是IOC什么是控制&#xff0c;谁控制谁什么是反转&#xff0c;从什么反转到什么了 IOC的注解五大类注解Controller注解&#xff08;控制器存储&#xff09;Service&#xff08;服务存储&#xff09;Repository&#xff08;仓库存储&#xff09;Componet(组件存储)C…

React从next/navigation和next/router导入useRouter区别

在Next.js项目中&#xff0c;从next/navigation和next/router导入useRouter有以下几点不同&#xff0c;它们分别适用于不同的Next.js版本&#xff0c;并提供不同的功能&#xff1a; next/router 版本兼容性&#xff1a;next/router适用于Next.js v13之前的版本。功能&#xf…

什么是vue

Vue.js&#xff08;通常简称为 Vue&#xff09;是一个用于构建用户界面的渐进式 JavaScript 框架。它由尤雨溪&#xff08;Evan You&#xff09;创建&#xff0c;并于2014年首次发布。Vue 设计的目的是能够灵活地适应开发者的需求&#xff0c;可以通过引入不同的插件和库来构建…

云端漫步:搭建个人博客的移动云之旅

&#x1f482;作者简介&#xff1a; Thunder Wang&#xff0c;阿里云社区专家博主&#xff0c;华为云云享专家&#xff0c;腾讯云社区认证作者&#xff0c;CSDN SAP应用技术领域优质创作者。在学习工作中&#xff0c;我通常使用偏后端的开发语言ABAP&#xff0c;SQL进行任务的完…