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

2021-09-11 07:09:10 字數 980 閱讀 1556

判斷能否將物品價值分成相等的兩份

每種物品有多件,需要剛好裝到總價值的一半,多重揹包問題

但是物品數量很多,無法常規變成01揹包,需要進行狀態壓縮

二進位制優化

把乙個數字z分成20+21+22+…+2x+y,即20+21+22+…+2x+y=z,則選取適當的左邊這些數20,21,22…2x,y,即可組成 0~z 中的任何乙個數,而不用每次都+1來到達需要的數

#include

#include

using namespace std;

int a[7]

;int val[

120+10]

;int dp[

420000

+100];

intmain()

int k=1;

//二進位制優化

for(

int i=

1,t=

1; i<=6;

++i,t=1)

if(a[i]

>0)

}memset

(dp,0,

sizeof

(dp));

//01揹包

for(

int i=

1; i++i)

for(

int j=sum/

2; j>=val[i]

; j--

) dp[j]

=max

(dp[j]

,dp[j-val[i]

]+val[i]);

if(dp[sum/2]

==sum/2)

// dp[sum/2]能否放滿

cout <<

"can be divided."

"can't be divided."

<}return0;

}

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

題目鏈結 dividing 大意 一系列marbles,是否能平分 看做乙個容量為總價值的一半的揹包,如果能裝滿,說明可以平分 第i個物體的的cost和weight都是i 所以最後的判斷條件是f v v 剪枝 如果總容量是奇數,一定不能平分 二進位制優化見揹包九講 include include i...

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