//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/16.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int v[7];
int dp[120000+100];
int main()
{
int kase=0;
while(true)
{
int sum=0;
for(int i=1;i<=6;i++){
scanf("%d",&v[i]);
sum+=v[i]*i;
}
if(sum==0) break;
memset(dp,0,sizeof(dp));
printf("Collection #%d:\n",++kase);
if(sum&1) {printf("Can't be divided.\n\n");continue;}
sum/=2;
for(int i=1;i<=6;i++)
{
int l=v[i],k=1;
while(k<l)
{
for(int j=sum;j>=k*i;j--)
dp[j]=max(dp[j],dp[j-k*i]+k*i);
l-=k;k<<=1;
}
for(int j=sum;j>=l*i;j--)
dp[j]=max(dp[j],dp[j-l*i]+l*i);
}
if(dp[sum]!=sum) printf("Can't be divided.\n\n");
else printf("Can be divided.\n\n");
}
return 0;
}
HDU 1059 Dividing(dp多重背包)
最新推荐文章于 2016-09-27 18:15:56 发布