先转化为0-1背包并用二进制处理。
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[6];
int dp[50005];
int v[100];
int main()
{ int res=0;
while(1)
{ if(res++) cout<<endl;
memset(dp,0,sizeof(dp));
bool flag=0;
int cnt=0;
int sum=0;
for(int i=0;i<6;++i)
{ cin>>a[i];
if(a[i]) flag=1;
sum+=(i+1)*a[i];
int t=1;
while(2*t<a[i]+1)
{
v[cnt++]=t*(i+1);
t=2*t;
}
v[cnt++]=(a[i]+1-t)*(i+1);
}
if(!flag) break;
for(int i=0;i<cnt;++i)
{
if(v[i]>sum/2) continue;
for(int j=sum/2;j>=v[i];--j)
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
cout<<"Collection #"<<res<<":"<<endl;
if(sum-dp[sum/2]==dp[sum/2]) cout<<"Can be divided."<<endl;
else cout<<"Can't be divided."<<endl;
}return 0;
}