lanqiao oj 186 糖果(状态压缩dp)

简介: lanqiao oj 186 糖果(状态压缩dp)

用户登录

#include<iostream>
#include<algorithm>
#include<cstring>
 
using namespace std ;
const int N = 21 ;
 
int n , m , k ;
int f[1<<N] ;//用二进制的方式表示状态
int kw[110] ;//每一包糖果的口味的表示方式
int main(){
  cin >> n >> m >> k ;
  memset(f,-1,sizeof(f)) ;
  for(int i = 1 ; i <= n ; i ++){//预处理每一包的状态
    int tmp = 0 ;
    for(int j = 1 ; j <= k ;j ++){
      int x ; cin >> x ;
      tmp |= (1 << (x-1)) ;
    }
    f[tmp] = 1 ;//有现成的一包糖果可以用来吃所以直接这一包就够用了
    kw[i] =tmp ;
  }
  for(int i = 0 ; i < 1 << m ; i ++){
    if(f[i] == -1) continue ;//如果没有出现过这种i情况,那我们就不能对这种情况进行加包,也就是扩展
    for(int j = 1 ; j <= n ; j ++){
      int tmp = kw[j] ;
//如果以前没出现过两个相交的情况 或者 当前的数量 大于 我们要更新的数量,那样就进行更新
      if(f[i|tmp] == -1 || f[i|tmp] > f[i] + 1) f[i|tmp] = f[i] + 1 ;
    }
  }
  cout << f[(1 << m) -1] << endl ; 
}
目录
相关文章
|
2月前
lanqiao OJ 1447 砝码称重
lanqiao OJ 1447 砝码称重
31 1
|
2月前
lanqiao OJ 1505 剪邮票
lanqiao OJ 1505 剪邮票
30 0
|
2月前
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 3513 岛屿个数(2023省赛)
16 2
|
2月前
lanqiao OJ 364 跳石头
lanqiao OJ 364 跳石头
36 6
|
2月前
lanqiao OJ 99 分巧克力
lanqiao OJ 99 分巧克力
14 1
|
2月前
lanqiao OJ 108 发现环
lanqiao OJ 108 发现环
16 1
|
2月前
lanqiao OJ 649 算式900
lanqiao OJ 649 算式900
16 1
|
2月前
lanqiao oj 17136 星球(状态压缩dp)
lanqiao oj 17136 星球(状态压缩dp)
13 0
|
2月前
lanqiao OJ 98 包子凑数
lanqiao OJ 98 包子凑数
11 0
|
2月前
lanqiao OJ 2097 青蛙过河
lanqiao OJ 2097 青蛙过河
15 0