poj1014-Dividing

来源:互联网 发布:redis与mysql的结合 编辑:程序博客网 时间:2024/05/16 23:49

http://poj.org/problem?id=1014

母函数

总价值value = ( i * ( num[ i ] ) ) ( i = 1,....6 ) 

A、如果value 为奇数,那么一定不能再分;

B、如果value为偶数,那么只需要判断母函数x ^ ( value / 2 ) 的系数是不是为0 ,如果为0 ,那么就表示不能再分,否则可以再分;

note:

由于num[ i ] 会很大,所以要用到一个定理:对于任意一种珠宝的个数,如果n >= 8 , 就可以将n 改写3(n为奇数,1不行),或者4(n为偶数),不然就可能会超时

#include<map>#include<set>#include<list>#include<cmath>#include<ctime>#include<deque>#include<stack>#include<bitset>#include<cstdio>#include<vector>#include<cstdlib>#include<cstring>#include<iomanip>#include<numeric>#include<sstream>#include<utility>#include<iostream>#include<algorithm>#include<functional>using namespace std ;int main(){int test = 1 , sum , t ;int a[ 20005 ] , b[ 20005 ] , num[ 10 ] ;while( 1 ){sum = 0 ;for( int i = 1 ; i <= 6 ; ++i ){scanf( "%d" , &num[ i ] ) ;if( num[ i ] >= 8 ){if( num[ i ] % 2 )num[ i ] = 3 ; elsenum[ i ] = 4 ;}sum += num[ i ] * i ;}if( sum == 0 )break ;if( sum % 2 ){printf( "Collection #%d:\nCan't be divided.\n\n" , test++ ) ;continue ;}memset( a , 0 , sizeof( a ) ) ;memset( b , 0 , sizeof( b ) ) ;a[ 0 ] = 1 ; t = sum / 2 ;for( int i = 1 ; i <= 6 ; ++i ){for( int j =  0 ; j <= t ; ++j ){for( int k = 0 ; k <= num[ i ] && k * i + j <= t ; ++k ){b[ k * i + j ] += a[ j  ] ;}}for( int j = 0 ; j <= t ; ++j ){a[ j ] = b[ j ] ;b[ j ] = 0 ;}}if( !a[ t ] ) printf( "Collection #%d:\nCan't be divided.\n\n" , test++ ) ;elseprintf( "Collection #%d:\nCan be divided.\n\n" , test++ ) ;}     return 0;}


原创粉丝点击