没做过多重背包,这题从严格意义上来讲也不算是多重背包。算是很水的递推方程了。
关键是看能不能找不出使得价格为sum/2的,通过递推连接就好了。关键是怎样可达...
#include<iostream>
#include<stdio.h>
#include<string>
int DP[120001];
using namespace std;
int main()
{
int line[7];
int testcase=0;
while( true )
{
memset( DP,0,sizeof(DP) );
int sum=0;
for( int i=1;i<=6;i++ )
{
scanf( "%d",&line[i] );
sum+=line[i]*i;
}
if( sum==0 )
break;
printf( "Collection #%d:\n",++testcase );
if( sum&1 )
{
printf( "Can't be divided.\n\n" );
continue;
}
DP[0]=1;
for( int i=1;i<=6;i++ )
for( int j=0;line[i];j++ )
{
if( line[i]>(1<<j) )
{
for( int k=sum/2;k>=i*(1<<j);k-- )
if( DP[k-i*(1<<j)] )
DP[k]=1;
line[i]-=(1<<j);
}
else
{
for( int k=sum/2;k>=i*line[i];k-- )
if( DP[k-i*line[i]] )
DP[k]=1;
line[i]=0;
}
}
if( DP[sum/2]==1 )
printf( "Can be divided.\n\n" );
else
printf( "Can't be divided.\n\n" );
}
return 0;
}