您的位置:首页 > 其它

HDU 1059 Dividing (多重背包)

2014-04-08 18:10 393 查看
传送门: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: