二进制优化
t=1;
while(n[i]-t>0)
{
n2[k++]=t*i;
n[i]=n[i]-t;
t*=2;
}
if(n[i]>0)
n2[k++]=n[i]*i;
第一次写二进制优化
http://acm.hdu.edu.cn/status.php
#include<iostream>
#include<cstring>
using namespace std;
int n2[20005],dp[120005];
int main()
{
int v1,v2,v3,v4,v5,v6;
int c=0,n[10],i,j;
while(cin>>v1>>v2>>v3>>v4>>v5>>v6)
{
c++;
int sum=v1+v2*2+v3*3+v4*4+v5*5+v6*6;
if(sum==0)
break;
cout<<"Collection #"<<c<<":"<<endl;
if(sum%2==1)
{
cout<<"Can't be divided."<<endl<<endl;;
continue;
}
n[1]=v1;n[2]=v2;n[3]=v3;n[4]=v4;n[5]=v5;n[6]=v6;
int k=1,t;
for(i=1;i<=6;i++)
{
if(n[i]==0)
continue;
else
{//二进制优化代码 完全转01
t=1;
while(n[i]-t>0)
{
n2[k++]=t*i;
n[i]=n[i]-t;
t*=2;
}
if(n[i]>0)
n2[k++]=n[i]*i;
}
}
memset(dp,0,sizeof(dp));
for(i=1;i<k;i++)//01背包代码
for(j=sum/2;j>=n2[i];j--)
dp[j]=max(dp[j],dp[j-n2[i]]+n2[i]);
if(dp[sum/2]==sum/2)
cout<<"Can be divided."<<endl<<endl;
else cout<<"Can't be divided."<<endl<<endl;
}
return 0;
}