#include<cstdio>
#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[10],dp[300000];
int main()
{
int k=1;
while(1)
{
memset(dp,0,sizeof(dp));
int flag=1,sum=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&a[i]);
sum+=i*a[i];
if(a[i]) flag=0;
}
if(flag) break;
printf("Collection #%d:\n",k++);
if(sum&1)
{
cout<<"Can't be divided."<<endl<<endl;
continue;
}
int t=sum/2;
for(int i=1;i<=6;i++)
{
for(int j=1;j<=a[i];j<<=1)
{
int cnt=i*j;
for(int k=t;k>=cnt;k--)
{
dp[k]=max(dp[k],dp[k-cnt]+cnt);
}
a[i]-=j;
}
if(a[i])
{
int cnt=i*a[i];
for(int k=t;k>=cnt;k--)
{
dp[k]=max(dp[k],dp[k-cnt]+cnt);
}
}
}
if(dp[t]==t) cout<<"Can be divided."<<endl;
else cout<<"Can't be divided."<<endl;
cout<<endl;
}
return 0;
}
多重背包(二进制优化)
猜你喜欢
转载自blog.csdn.net/qq_40634175/article/details/88782904
今日推荐
周排行