POJ 1014

ExpandedBlockStart.gif code
 1  #include  < iostream >
 2  using   namespace  std;
 3 
 4  bool  dp( int  array[ 7 ])
 5  {
 6       bool  flag[ 60001 ];
 7       int  i,j,k,sum  =   0 ,max = 0 ;
 8       for (i = 1 ;i <= 6 ;i ++ )
 9      {
10          sum  +=  array[i] * i;
11      }
12 
13       if (sum % 2 != 0 )
14      {
15           return   false ;
16      }
17      
18      memset(flag, 0 , sizeof (flag));
19      flag[ 0 =   true ;
20       for (i = 1 ;i <= 6 ;i ++ )
21      {
22           if (array[i] > 0 )
23          {
24               for (j = max;j >= 0 ;j -- )    
25              {
26                   if (flag[j])
27                  {
28                       for (k = 1 ;k <= array[i];k ++ )
29                      {
30                           if (j + k * i == sum / 2 )
31                          {
32                               return   true ;  
33                          }
34 
35                           if (j + k * i > sum / 2   ||  flag[j + k * i])
36                          {
37                               break ;
38                          }
39                          flag[j + k * i]  =   true ;
40                      }
41                  }
42              }
43          }
44          max  +=  array[i] * i;
45           if (max > sum / 2
46          {
47              max  =  sum / 2 ;
48          }
49      }
50       return   false ;
51  }
52 
53  int  main()
54  {
55       int  count  =   1 ;
56       int  array[ 7 ];
57       while ( true )
58      {
59           for ( int  i = 1 ;i <= 6 ;i ++ )
60          {
61              scanf( " %d " , & array[i]);
62          }
63 
64           if (array[ 1 ] == 0 && array[ 2 ] == 0 && array[ 3 ] == 0 && array[ 4 ] == 0 && array[ 5 ] == 0 && array[ 6 ] == 0 )
65          {
66               break ;
67          }
68           else
69          {
70               if ( ! dp(array))
71              {
72                  printf( " Collection #%d:\nCan't be divided.\n\n " ,count ++ );
73              }
74               else
75              {
76                  printf( " Collection #%d:\nCan be divided.\n\n " ,count ++ );
77              }
78          }
79      }
80 
81       return   0 ;
82  }

 

转载于:https://www.cnblogs.com/zhtf2014/archive/2010/08/19/1803982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值