HDOJ Dividing DP

来源:互联网 发布:免费地磅称重软件 编辑:程序博客网 时间:2024/06/05 11:48

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

关键是看能不能找不出使得价格为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;}


原创粉丝点击