题目分析:
“什么?你和我说这道题1<<24是状态压缩?”
“你仔细看一下题。”
“等等,时限…90s?太好了,我可以卡评测机了。”
好吧事实证明我没有那个能力卡评测机,最后我被常数卡了。
我们用F[I]表示前I个物品最后用I个几个包,G[I]表示最后一个包的剩余体积。于是这道题就可以直接用状态压缩水过去了->.->其实这篇题解被我水过去了->.->不过这道题在定了上面的状态后确实很容易做了(哦对了稍微贪一下心把背包按照体积从大到小排序)。
参考代码:
//A[I]表示第I个物品的体积
//C[I]表示背包排序后的体积
//K=(1<<N)-1
for(I=N;I>=1;I--){
A[1<<(I-1)]=A[I];
}
for(I=1;I<=K;I++){
F[I]=Inf;G[I]=-Inf;LL Tmp;
for(J=I;J;J-=Tmp){
Tmp=LowBit(J);LL X=I-Tmp;
if(A[Tmp]<=G[X]&&(F[X]<F[I]||(F[X]==F[I]&&G[X]-A[Tmp]>G[I]))){
F[I]=F[X];G[I]=G[X]-A[Tmp];
} else if(C[F[X]+1]>=A[Tmp]&&(F[X]+1<F[I]||(F[X]+1==F[I]&&C[F[X]+1]>G[I]+A[Tmp]))){
F[I]=F[X]+1;G[I]=C[F[I]]-A[Tmp];
}
}
}