POJ1014 多重揹包(二進位制拆分)

2021-07-15 16:16:36 字數 926 閱讀 4798

題目鏈結

題目大意:給出6個數,分別代表價值為1~6的6種物品的數量,求能否在價值相同的情況下平分這些物品。

思路:多重揹包。一開始拆成01揹包來做,寫了三層迴圈,很顯然結果tle了。後來上網看了一下題解,大致意思是把每一種物品的數量拆成1,2,4,8,……這樣的2的n次方數,比如將12拆成1,2,4,5四個數,這樣可以用這些數字來拼湊成任意乙個所需要揹包的數。

#include"cstdio"

#include"iostream"

#include"cstring"

#include"algorithm"

#include"cmath"

using namespace std;

intx[10];//初始輸入

int dp[60011];

inty[20005];//拆分後的物品價值

int max(int a,int b)

int main()

int cnt=0;

sum=sum/2;

memset(dp,0,sizeof dp);

//拆分寫搓wa了很多遍

for(int i=1;i<=6;i++)

y[cnt++]=x[i]*i;

}for(int i=0;ifor(int k=sum;k>=y[i];k--)

dp[k]=max(dp[k],dp[k-y[i]]+y[i]);//狀態轉移方程

}if(dp[sum]==sum)

printf("collection #%d:\ncan be divided.\n\n",cas++);

else

printf("collection #%d:\ncan't be divided.\n\n",cas++);

}return

0;}

多重揹包 二進位制拆分 POJ1014

題意 有權值分別為1,2,3,4,5,6的大理石,每種都有若干塊,能否把它們分成權值相等的2份。大理石的總數量不超過20000。多重揹包 分析 判斷dp v 2 v 2 即可,但過程如果用普通做法會超時,即多重揹包當成01揹包做效率很低,這時候要用二進位制拆分優化,將複雜度變為 二進位制拆分原理 這...

POJ1014 多重揹包

今天開始dp了,第一道多重揹包,模板題,還是想了很久,太弱了 題意 一行給出6個數,表示從1到6,6個不同權值的個數.求能否將所有權值不分割的分成權值相等的兩份.首先總權值為奇數的肯定不符合要求,接下來就是乙個多重揹包了.多重揹包的二進位制拆分我的理解大概是 首先將乙個數按二進位制拆分之後可以用拆分...

poj1014多重揹包

做這個題目的時候受到dp時取min還是max的影響,不知道最後該怎麼做,看了大神的blog有了思路,直接貼上 了。出處 優you的部落格 memory time 656k 16ms 多重揹包 二進位制優化 include includeusing namespace std int n 7 價值為i...