您的位置:首页 > 其它

HDU 1059 Dividing(dp多重背包)

2016-09-16 19:28 363 查看
//
//  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: