P8687 [蓝桥杯 2019 省 A] 糖果

~~~~~ P8687 [蓝桥杯 2019 省 A] 糖果 ~~~~~ 总题单链接

思路

~~~~~ 发现 k ≤ 20 , m ≤ 20 k\le20,m\le 20 k≤20,m≤20,考虑状压DP。

~~~~~ 预处理 g [ i ] g[i] g[i] 表示第 i i i 包糖有哪几种糖果。

~~~~~ 设 d p [ i ] dp[i] dp[i] 表示在 i i i 状态下最少要买几包糖。

~~~~~ 对于第 i i i 包糖,枚举所有状态 j j j, d p [ g [ i ] ∣ j ] = m i n ( d p [ g [ i ] ∣ j ] , d p [ j ] + 1 ) dp[g[i]|j]=min(dp[g[i]|j],dp[j]+1) dp[g[i]∣j]=min(dp[g[i]∣j],dp[j]+1)。

代码

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll n,m,Q,g[105],dp[(1ll<<20)+5];

signed main(){
	ios::sync_with_stdio(false);
	
	cin>>n>>m>>Q;
	for(ll i=1;i<=n;i++){
		for(ll j=1;j<=Q;j++){
			ll k;cin>>k;
			g[i]|=(1ll<<(k-1));
		}
	}
	
	memset(dp,0x3f,sizeof(dp));
	dp[0]=0;
	
	for(ll i=1;i<=n;i++)
		for(ll j=(1ll<<m)-1;j>=0;j--)
			dp[g[i]|j]=min(dp[g[i]|j],dp[j]+1);
	
	cout<<(dp[(1ll<<m)-1]<=n?dp[(1ll<<m)-1]:-1);
	
	return 0;
}
相关推荐
是娇娇公主~14 分钟前
C++ std::map 与 std::unordered_map
c++·stl
努力学习的小廉17 分钟前
我爱学算法之——动态规划(一)
算法·动态规划
篮l球场19 分钟前
前 K 个高频元素
数据结构·算法·leetcode
EQUINOX131 分钟前
马尔可夫链
线性代数·动态规划·随机数学
汉克老师34 分钟前
GESP5级C++考试语法知识(十一、递归算法(一))
c++·算法·记忆化搜索·递归算法·递归优化
是娇娇公主~1 小时前
C++迭代器详解
开发语言·c++·stl
qq_148115371 小时前
C++网络编程(Boost.Asio)
开发语言·c++·算法
2301_804215411 小时前
内存映射文件高级用法
开发语言·c++·算法
ZHENGZJM1 小时前
负载均衡式在线评测系统(Load-Balanced Online OJ)技术全景指南
c++·负载均衡·软件工程·idea
CoderCodingNo1 小时前
【GESP】C++八级考试大纲知识点梳理 (5) 代数与平面几何
开发语言·c++