題目鏈結
題目大意:給出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...