1. 程式人生 > >dp (多重揹包的二進位制優化)

dp (多重揹包的二進位制優化)

在多重揹包的問題中,有時物品的件數會給的非常大,此時從1件到n件遍歷很容易超時,下面講一下二進位制優化的思路

答題思想為:把同種多件物體轉換為多種單件物體。

我們已經知道,1、2、4、8 、16 、 32……2^n  可以組成從1到2^(n+1)-1中的任何數,

所以,對於給定的n,我們只要把它分解為從2^x次冪的數,(最後剩下的一個直接補齊,不要求2^x)就可以組成任意件小於等於x的數且不會超過

對於分分好的這些組,每組當成一個新的物品,都具有新的樹形,就成功的把同種多件物體轉換成了多種單件物體,就可以用01揹包來寫,在物品件數較多時優化很大!

 for(i=0;i<n;i++){
        for(j=1;j<=a[i].num;j<<=1){ //分解為2^x
            value[tot]=j*a[i].v;
            weight[tot]=j*a[i].w;
            tot++;
            a[i].num-=j;
        }
        if(a[i].num>0){     //最後一項補齊 裁分的時候可能留下一項
            value[tot]=a[i].num*a[i].v;
            weight[tot]=a[i].num*a[i].w;
            tot++;
        }
    }