Saturday 21 March 2009

HOJ ( acm.hdu.edu.cn ) 1059





#include<iostream>
#include<cstdlib>
using namespace std;
#define A_SIZE 60001
bool can[A_SIZE];
bool can_div(int marbles[6])
{
int mid=0,i,j,k,t,back=0;
for(i=0;i<6;++i)mid+=marbles[i]*(i+1);
if (mid&1) return false;
mid>>=1;
// cerr<<" [debug] mid="<<mid<<endl;
memset(can,0,A_SIZE);
can[0]=1;
for(i=1;i<=6;++i)
{
if(marbles[i-1])
{
for(j=back;j>=0;--j)
{
if(can[j])
{
if (can[mid]) return true;
for(k=1;k<=marbles[i-1];++k)
{
t=i*k+j;
if(t>mid)break;
if(can[t])break;
can[t]=1;
// cerr<<" [debug] t="<<t<<"\ti="<<i<<"\tj="<<j<<"\tk="<<k<<endl;
}
}
}
back+=i*marbles[i-1];
if (back>mid) back=mid;
}
}
if(can[mid])return true;
return false;
}

int main()
{
int marbles[6];
int q=0,t=0;
for(;;)
{
q=0;++t;
for(int i=0;i<6;++i)
{
cin>>marbles[i];
q+=marbles[i];
}
if(q==0)break;
cout<<"Collection #"<<t<<":\n"<<(can_div(marbles)?"Can":"Can\'t")<<" be divided.\n\n";
}
return 0;
}

No comments:

Post a Comment