題目鏈結 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...