hdu 1059多重揹包 二進位制優化

2021-07-24 15:01:58 字數 809 閱讀 1141

題目鏈結 dividing

大意:一系列marbles,是否能平分

看做乙個容量為總價值的一半的揹包,如果能裝滿,說明可以平分

第i個物體的的cost和weight都是i

所以最後的判斷條件是f[v]==v

剪枝:如果總容量是奇數,一定不能平分

二進位制優化見揹包九講

#include #include #includeusing namespace std;

int f[120005];

int m[7];

int v;

void zeroonepack(int c, int w)

}void completepack(int c, int w)

}void multiplepack(int c, int w, int m)

int k = 1;

while (k < m)

zeroonepack(c*m, w*m);

}int main()

if (!v)break;

printf("collection #%d:\n", c++);

if (v % 2)

v = v / 2;

for (int i = 1; i <= 6; ++i)multiplepack(i, i, m[i]);

if (v == f[v])printf("can be divided.\n\n");

else printf("can't be divided.\n\n");

}return 0;

}

HDU1059 多重揹包,二進位制優化

判斷能否將物品價值分成相等的兩份 每種物品有多件,需要剛好裝到總價值的一半,多重揹包問題 但是物品數量很多,無法常規變成01揹包,需要進行狀態壓縮 二進位制優化 把乙個數字z分成20 21 22 2x y,即20 21 22 2x y z,則選取適當的左邊這些數20,21,22 2x,y,即可組成 ...

HDU 1059 多重揹包

個人覺得,這個可以作為多重揹包的模板使用,其中包括了簡單的0 1揹包和完全揹包,分清楚它們三個的區別。include include define n 60005 define max a,b a b?a b int c n void complete int cost,int weight,int...

hdu 1059 多重揹包

題目的意思 有一堆大理石,按其大小分為1 6 種價值,兩個人想分得的價值相同的大理石,已知每種價值的大理石個數,問是否能讓兩個人分得價值相同的大理石?題目輸入 1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0 題目輸出 collection 1 can t be divided...