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 ; 
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值