dp (多重揹包的二進位制優化)
阿新 • • 發佈:2018-12-10
在多重揹包的問題中,有時物品的件數會給的非常大,此時從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++; } }