判斷能否將物品價值分成相等的兩份
每種物品有多件,需要剛好裝到總價值的一半,多重揹包問題
但是物品數量很多,無法常規變成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...