蓝桥杯:糖果
作者:互联网
题目描述
糖果店的老板一共有 MM 种口味的糖果出售。为了方便描述,我们将 MM 种口味编号 1∼ MM。
小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 KK 颗一包整包出售。
幸好糖果包装上注明了其中 KK 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。
给定 NN 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。
输出描述
输出一个整数表示答案。如果小明无法品尝所有口味,输出 −1。
输入输出样例
示例
输入
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
输出
2
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
很巧妙,我第一次遇到这种二进制位的动态规划,这里用一个数组保存各个包的状态,
代码如下所示:
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f,N=1e2+7;
int bag[N];
int f[1<<20];
int main()
{
// 请在此输入您的代码
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int all=(1<<m)-1;
for(int i=0;i<=all;++i) f[i]=INF;
for(int i=0;i<n;++i)
{
int tmp=0,state=0;
for(int j=0;j<k;++j)
{
scanf("%d",&tmp);
tmp--;
state |= 1<<tmp;
}
bag[i]=state;
f[state]=1;
}
for(int i=0;i<n;++i)
{
for(int j=0;j<=all;++j)
{
if(f[j]==INF) continue;
f[j|bag[i]]=min(f[j|bag[i]],f[j]+1);
}
}
if(f[all]==INF) cout<<-1<<endl;
else cout<<f[all]<<endl;
return 0;
}
标签:小明,输出,int,蓝桥,MM,口味,糖果 来源: https://blog.csdn.net/weixin_46266058/article/details/123065571