今天開始dp了,第一道多重揹包,模板題,還是想了很久,太弱了……..
題意:一行給出6個數,表示從1到6,6個不同權值的個數.求能否將所有權值不分割的分成權值相等的兩份.
首先總權值為奇數的肯定不符合要求,接下來就是乙個多重揹包了.
多重揹包的二進位制拆分我的理解大概是;
首先將乙個數按二進位制拆分之後可以用拆分後的數相加得到小於或等於這個數的任意乙個數.拆分之後得到許多小堆,接下來就只需要以堆為單位做一次0-1揹包就可以了.
#include
#include
#include
using namespace std;
struct node
div[20000];
int n[7];
int dp[60005];
int main()
if(sum==0) break;
if(sum%2!=0)
sum=sum/2;
int kcnt=0;
for(i=1;i<=6;i++)
div[kcnt].num=m;
div[kcnt++].value=i;
}for(i=0;iint tem=div[i].num*div[i].value;
for(j=sum;j>=tem;j--)
}if(dp[sum]==sum)
poj1014多重揹包
做這個題目的時候受到dp時取min還是max的影響,不知道最後該怎麼做,看了大神的blog有了思路,直接貼上 了。出處 優you的部落格 memory time 656k 16ms 多重揹包 二進位制優化 include includeusing namespace std int n 7 價值為i...
poj 1014多重揹包
題意 給出價值為1,2,3,4,5,6的6種物品數量,問是否能將物品分成兩份,使兩份的總價值相等。思路 求出總價值除二,做多重揹包,需要二進位制優化。include include includeusing namespace std int n 7 int v,sum bool flag int ...
poj 1014 多重揹包問題
dividing 題意 有一堆大理石,每個石頭的價值在1 6之間,每種 的石頭有多個。現在要求將這堆石頭分成兩份,使得兩份的總價值相同,回答是否存在一種方法將可以實現劃分。這是一道多重揹包問題,多重揹包問題的做法可以是先將它轉化為01揹包,再用01揹包問題的方法繼續求解。轉化的思路是,將乙個 下的幾...