hdu 1059 Dividing 多重揹包

2021-08-07 22:06:10 字數 836 閱讀 8534

傳送門 分析

多重揹包按照二進位制拆分為01揹包

假設價值為w的物品有n個, 則按照 1, 2, 4, 8, ….., (1^log(n)) 拆分

設sum(1, (1^log(n)) = sum, 設 ret = n - sum;

則有在 (0~sum) 內的所有數p都可以用拆分數的和表示 (二進位制表示)

而(sum ~ n) 之間的數可用 p+ret表示

拆分完畢, 0-1揹包構建完成.

#include 

#include

#include

using

namespace

std;

const

int max = 2e5+10;

const

int inf = 2e5+10;

int a[7], dp[max], sum, t, tmax, tmp;

int mmax(int a, int b)

bool getin()

memset(dp, 0, sizeof(dp));

sum = 0;

return ret;

}bool judge()

for (int j = sum, tmp = a[i]*i; j >= tmp; --j)

}if (dp[sum] == sum)

return

true;

else

return

false;

}int main()

return

0;}

2017-09-08

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 ...