本人用动归做的,多重背包的二进制优化。有点可惜wa了几遍,竟然是改变了一个变量的值。弱智错误,导致本人这个题加上以前的差不多敲了20遍吧。
#include<iostream>
using namespace std;
int marble[20020];
int dp[120020];
int ko[7];
int maxi(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int time,sum,j,i,k,jk,p;
time=1;
while(cin>>ko[1]>>ko[2]>>ko[3]>>ko[4]>>ko[5]>>ko[6])
{
if(ko[1]==0&&ko[2]==0&&ko[3]==0&&ko[4]==0&&ko[5]==0&&ko[6]==0)
break;
sum=1*ko[1]+2*ko[2]+3*ko[3]+4*ko[4]+5*ko[5]+6*ko[6];
if(sum%2==1)
{
cout<<"Collection #"<<time<<":"<<endl<<"Can't be divided."<<endl<<endl;
time=time+1;
}
else {
j=1;
for(i=1;i<=6;i++)
{
for(k=1;k<=ko[i];k=k*2)
{
marble[j]=k*i;
ko[i]=ko[i]-k;
j=j+1;
}
if(ko[i]>0)
{
marble[j]=ko[i]*i;
j=j+1;
}
}
jk=sum/2;
for(i=0;i<=jk;i++)
dp[i]=0;
for(i=1;i<j;i++)
for(p=jk;p>=marble[i];p--)
{
dp[p]=maxi(dp[p],dp[p-marble[i]]+marble[i]);
}
/*cout<<dp[jk]<<endl;*/
if(dp[jk]==jk)
{
cout<<"Collection #"<<time<<":"<<endl<<"Can be divided."<<endl<<endl;
time=time+1;
}
else {
cout<<"Collection #"<<time<<":"<<endl<<"Can't be divided."<<endl<<endl;
time=time+1;
}
}
}
return 0;
}