BZOJ 3717 Pakowanie【状态压缩】

题目分析:
“什么?你和我说这道题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];
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/80469044
今日推荐