HDU 1059 Dividing (多重背包)

来源:互联网 发布:jquery拼接json字符串 编辑:程序博客网 时间:2024/06/05 09:12

传送门:HDU 1059

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int V,v;int data[7],dp[120001];void bag01(int c,int w){    for(int j=V;j>=c;j--)        dp[j]=max(dp[j],dp[j-c]+w);}void bagall(int c,int w){    for(int j=c;j<=V;j++)        dp[j]=max(dp[j],dp[j-c]+w);}void dcbag(int c,int w,int n){    if(c*n>V) bagall(c,w);    else    {        int num=1;        while(num<n)        {            bag01(c*num,w*num);            n-=num;            num+=num;        }        bag01(c*n,w*n);    }}int main(){    int sum,t=1;    while(~scanf("%d%d%d%d%d%d",&data[1],&data[2],&data[3],&data[4],&data[5],&data[6]))    {        if(data[1]==0&&data[2]==0&&data[3]==0&&data[4]==0&&data[5]==0&&data[6]==0) break;        cout<<"Collection #"<<t<<":"<<endl;        sum=data[1]+data[2]*2+data[3]*3+data[4]*4+data[5]*5+data[6]*6;        if(sum%2!=0) cout<<"Can't be divided."<<endl<<endl;        else        {           V=sum/2;           memset(dp,0,sizeof(dp));           for(int i=1;i<=6;i++) dcbag(i,i,data[i]);           if(dp[V]==V) cout<<"Can be divided."<<endl<<endl;           else         cout<<"Can't be divided."<<endl<<endl;        }        t++;    }    return 0;}


0 0