HLOJ_1040

 1  // HLOJ 1040  Accepted  31 3716 761 C++  
 2 
 3  // 分层的动态规划
 4  // 倒序可能更简单 -- 避免干扰
 5 
 6  #include  < iostream >
 7 
 8  using   namespace  std ;
 9 
10  const   int  size  =   30  ;
11  int  money[size] ;
12 
13  int  inn ;
14  int  inm ;
15 
16  int  dp[size][ 30000 ] ;
17  int  flag[ 30000 ] ;
18 
19  int  main()
20  {
21       /* while( cin >> inn && inn ) 
22      {
23          memset( dp, 0, sizeof(dp) ) ;
24 
25          for( int i=1; i<=inn; i++ ) cin >> money[i] ;
26 
27          cin >> inm ;
28 
29          dp[0][0] = 1 ;
30          int total = 0 ;
31          for( int i=1; i<=inn; i++ )        
32          {
33              for( int j=0; j<=total; j++ )
34              {
35                  if( dp[i-1][j] )
36                  {
37                      dp[i][j] = 1 ;
38                      if( j + money[i] <= inm )
39                      {
40                          dp[i][j+money[i]] = 1 ;
41                      }
42                  }
43              }
44              total += money[i] ;
45          }
46 
47          int ans = 0 ;
48          for( int j=inm; j>=0; j-- )
49          {
50              if( dp[inn][j] )
51              {
52                  ans = j ; break ;
53              }
54          }
55 
56          printf( "%d\n", ans ) ;
57      } */
58 
59       while ( cin  >>  inn )
60      {
61           for int  i = 1 ; i <= inn; i ++  ) cin  >>  money[i] ;
62          cin  >>  inm ;
63 
64          memset( flag,  0 sizeof (flag) ) ;
65 
66           int  total  =   0  ; flag[ 0 =   1  ;
67           for int  i = 1 ; i <= inn; i ++  )
68          {
69               for int  j = total; j >= 0 ; j --  )
70              {
71                   if ( flag[j]  &&  j + money[i] <= inm )
72                  {
73                      flag[j + money[i]]  =   1  ;
74                  }
75              }
76              total  +=  money[i] ;
77 
78          }
79 
80           int  ans  =   0  ;
81           for int  i = inm; i >= 0 ; i --  )
82          {
83               if ( flag[i] )
84              {
85                  ans  =  i ;  break  ;
86              }
87          }
88 
89          cout  <<  ans  <<  endl ;
90      }
91 
92       return   0  ;
93  }

你可能感兴趣的:(HLOJ_1040)