糖果 | 第十届蓝桥杯省赛C++A组

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

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

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

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

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

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

输入格式

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

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

输出格式

一个整数表示答案。

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

数据范围

1≤N≤100,

1≤M,K≤20,

1≤Ti≤M

输入样例:
复制代码
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
输出样例:
复制代码
2
题解:

开始使用DFS做,每种糖果包只有选和不选两种情况,结果就TLE了。

因为只有选和不选两种状态,数据量又不是很大,很可能是使用状压DP,(但是可以直接看tag)。

首先是通过位运算,把当前每包的状态列出来。

然后制作一个2^m大小的数组dp记录全部情况达成的最小次数。

遍历这n包糖果的情况,从dp最后一位开始遍历,即m=5情况下,从11111开始遍历。

其中的 j&(~N[i]) 语句是列举出原情况包含的所有子情况,比如例题中的1 1 2,写出情况就是0 0 0 1 1(从后往前是1-k),每一位翻转后就是1 1 1 0 0,因为当前只有0 0 0 0 0是有数的,初始为0。则当遍历到情况0 0 0 1 1、0 0 0 0 1、0 0 0 1 0这三种情况时,才会按位或得到0 0 0 0 0,所以才会全部赋值为1,即当只需要1只需要2只需要1和2这三种情况最少抽1包就可以满足。

当然,这道题还可以用 dfs+剪枝+排序优化+去除优化+IDA* 做,但是不如这个简单,(实际上是懒)。

代码:
cpp 复制代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<map>
#include<set>
using namespace std;
typedef long long int ll;

/*
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
*/
#define INF 0x3f3f3f3f

int n,m,k;
int N[101]={0};
int dp[1<<21]={0};

int main(){
    cin >> n >> m >> k;
    for(int i=1;i<=n;i++){
        for(int j=0;j<k;j++){
            int a;
            cin >> a;
            N[i]|=(1<<(a-1));
        }
    }
    memset(dp,INF,sizeof dp);
    dp[0]=0;
    for(int i=1;i<=n;i++){
        for(int j=(1<<m)-1;j>0;j--){
            dp[j]=min(dp[j],dp[j&(~N[i])]+1);
        }
    }
    if(dp[(1<<m)-1]==INF){
        cout << -1 << "\n";
    }
    else{
        cout << dp[(1<<m)-1] <<"\n";
    }
}
相关推荐
啥都鼓捣的小yao几秒前
课程11. 计算机视觉、自编码器和生成对抗网络 (GAN)
人工智能·python·深度学习·神经网络·算法·生成对抗网络·计算机视觉
ROCKY_8174 分钟前
数据结构(九)——排序
数据结构·算法·排序算法
软件派1 小时前
基于YOLO算法的目标检测系统实现指南
算法·yolo·目标检测
代码小将3 小时前
Leetcode209做题笔记
java·笔记·算法
Musennn4 小时前
leetcode 15.三数之和 思路分析
算法·leetcode·职场和发展
君鼎5 小时前
C++设计模式——单例模式
c++·单例模式·设计模式
刚入门的大一新生7 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
CM莫问7 小时前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
小冯的编程学习之路7 小时前
【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
c++·selenium·测试工具·jmeter·自动化·测试用例·postman
康谋自动驾驶8 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车