HDU1059Dividing 二進位制優化多重揹包

2021-06-18 00:27:55 字數 725 閱讀 7841

/*問你能不能將給出的資源平分成兩半,那麼我們就以一半為揹包,執行多重揹包模版

但是注意了,由於個數過大,直接執行會超時,所以要用二進位制拆分每種的個數*/

#include#include#includeusing namespace std;

int w[120005],vr[120005],dp[120005];

int a[7],v[7];

int numw;

void cf(int n,int ok)

if(n-(sum-e)>0)

}int main()

if(n2!=0)

if(n3!=0)

if(n4!=0)

if(n5!=0)

if(n6!=0)

int sum=0;

//printf("%d\n",num);

for(i=1;i=w[i]*vr[i];j--)

dp[j]=max(dp[j],dp[j-w[i]*vr[i]]+w[i]*vr[i]);

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

if(dp[sum/2]==sum-dp[sum/2]) printf("can be divided.\n\n");

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

}return 0;

}

hdu1059 Dividing 多重揹包

題意 將價值分別為1,2,3,4,5,6的6種多個物品平均分兩坨 所有物品數量加起來不超過2w個 很容易想到dp的思路,dp i 表示是否存在使價值為i的選法,dp i dp i j j為物品的價值。然後對所有物品進行這種迴圈即可,但是會超時,這時候就需要將大量的相同物品二進位制分割,具體的原理需要...

HDU 1059 Dividing(多重揹包)

題意 輸入6個數字,表示重量分別為1 2 3 4 5 6的大理石的數量 問能不能將這些大理石均分,不能把大理石弄破了 能的話就輸出 can be divided.不能就輸出can t be divided.解題思路 邊輸入邊求和 如果和為0,就break 如果和為奇數,就輸出can t be div...

HDU 1059 Dividing 多重揹包

題目就是要分彈珠,一人一半,多乙個少乙個都不行。六種彈珠,ni表示價值i的彈珠的數量,問能不能分。1.總價值為奇數當然不能分了。2.總價值為偶數,利用多重揹包求解,揹包容量為m 2,計算dp m 能否等於m,能就可以分。include includeint val 10 num 10 int dp ...