当前位置: 代码迷 >> 综合 >> HDOJ Dividing DP
  详细解决方案

HDOJ Dividing DP

热度:42   发布时间:2024-01-20 20:39:29.0

没做过多重背包,这题从严格意义上来讲也不算是多重背包。算是很水的递推方程了。

关键是看能不能找不出使得价格为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" );elseprintf( "Can't be divided.\n\n" );}return 0;
}