采用了滚动数组的方法。
状态转移:把第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]);
}