二进制优化写跪好几次感觉有点醉= =果然是好久没写dp都忘了
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
bool flag;
int T,a[10],dp[60005],tot,now,temp,x;
int main(void)
{
while(true)
{
flag=false;tot=0;now=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&a[i]);
tot+=a[i]*i;
}
if(!tot)break;
if(tot%2)flag=false;
else
{
tot/=2;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=6;i++)
{
x=1;
for(;a[i]>0;)
{
for(int k=now;k>=0;k--)
if(dp[k])
{
temp=k+i*min(a[i],x);
if(temp<=tot)
{
dp[temp]=1;
if(temp==tot)
{
flag=true;
break;
}
now=max(now,temp);
}
}
a[i]-=x;x<<=1;
if(flag)break;
}
if(flag)break;
}
}
printf("Collection #%d:\n",++T);
if(flag)printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}