多重背包二进制拆分思想
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#define LL long long
#define myabs(x) ((x)>0?(x):(-(x)))
using namespace std;
const int inf=0x3f3f3f3f;
int s[7];
int f[20000*6+10];
int main()
{
int cas=0;
while(true)
{
int i,sum=0;
for(i=1;i<=6;i++)
{
scanf("%d",&s[i]);
sum+=s[i]*i;
}
if(!s[1]&&!s[2]&&!s[3]&&!s[4]&&!s[5]&&!s[6]) break;
printf("Collection #%d:\n",++cas);
if(sum%2)
{
printf("Can't be divided.\n\n");
continue;
}
sum/=2;
memset(f,0,sizeof(f));
f[0]=1;
int j,k,tem;
for(i=1;i<=6;i++)
{
for(k=1,tem=0;(tem+k)<=s[i];k<<=1)
{
tem+=k;
for(j=sum;j>=k*i;j--)
f[j]|=f[j-k*i];
}
if(tem<s[i])
{
tem=s[i]-tem;
for(j=sum;j>=tem*i;j--)
f[j]|=f[j-tem*i];
}
}
if(f[sum]) printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}