糖果 | 第十届蓝桥杯省赛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";
    }
}
相关推荐
千寻girling3 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱6 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
不想写代码的星星7 小时前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
CoovallyAIHub1 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
木心月转码ing1 天前
Hot100-Day14-T33搜索旋转排序数组
算法
会员源码网1 天前
内存泄漏(如未关闭流、缓存无限增长)
算法
颜酱1 天前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱1 天前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub2 天前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉