蓝桥杯 2019 糖果(01背包问题的状态压缩)

采用了滚动数组的方法。

状态转移:把第i,i+1,i+2的糖果装到 j的背包后,现有背包的糖果为j|a[i]。

#include<bits/stdc++.h>
using namespace std;

int n,m,k,temp;
int a[25],d[1<<21];

const int inf=0x3f3f3f3f;



int main(){
	int target=0;
	scanf("%d %d %d",&n,&m,&k);
	memset(d,0x3f,sizeof(d));
	for(int i=0;i<m;i++)
	 target=target|(1<<i);
	
	for(int i=1;i<=n;i++){
		a[i]=0;
		for(int j=0;j<k;j++){
			scanf("%d",&temp);
			a[i]=a[i]|(1<<(temp-1));
		}
	}
	
	d[0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=(1<<m)-1;j++)
		d[j|a[i]]=min(d[j|a[i]],d[j]+1);
	}
	if(d[(1<<m)-1]>=inf)
	printf("-1");
	else
	printf("%d\n",d[(1<<m)-1]);


}
发布了75 篇原创文章 · 获赞 77 · 访问量 4017

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/104778647
今日推荐