Advertisement
Guest User

Untitled

a guest
May 15th, 2014
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <climits>
  4. #include <functional>
  5. #include <cstring>
  6.  
  7. int n, m;
  8. int A[24], C[100];
  9. int Sols[2];
  10. int Sol[2][1250000][24];
  11.  
  12. inline int max(const int a, const int b) { return a > b ? a : b; }
  13.  
  14. inline void FFD() {
  15.     int c[24];
  16.     for( int i = 0; i < m; i++ )
  17.         c[i] = C[i];
  18.  
  19.     int sol = 0;
  20.     for( int i = 0; i < n; i++ ) {
  21.         for( int j = 0; j <= m; j++ ) {
  22.             if( j == m )
  23.                 return;
  24.  
  25.             if( c[j] >= A[i] ) {
  26.                 c[j] -= A[i];
  27.                 if( j+1 > sol ) sol = j+1;
  28.                 break;
  29.             }
  30.         }
  31.     }
  32.  
  33.     if( sol < m )
  34.         m = sol;
  35. }
  36.  
  37. int main() {
  38.     scanf("%d %d", &n, &m );
  39.     for( int i = 0; i < n; i++ )
  40.         scanf("%d", A+i );
  41.  
  42.     for( int i = 0; i < m; i++ )
  43.         scanf("%d", C+i );
  44.  
  45.     std::sort(A, A+n, std::greater<int>());
  46.     std::sort(C, C+m, std::greater<int>());
  47.     if( m > n )
  48.         m = n;
  49.  
  50.     while( m > 0 and C[m-1] < A[n-1] )
  51.         m--;
  52.  
  53.     std::sort(A, A+n);
  54.     FFD();
  55.     std::sort(A, A+n, std::greater<int>());
  56.     FFD();
  57.  
  58.     int Asum = 0;
  59.     for( int i = 0; i < n; i++ )
  60.         Asum += A[i];
  61.  
  62.     int M = m, Csum = 0;
  63.     for( m = 0; m < M and Csum < Asum; m++ ) Csum += C[m];
  64.  
  65.     if( Csum < Asum ) {
  66.         puts("NIE");
  67.         return 0;
  68.     }
  69.  
  70.     for( ; m <= M; m++ ) {
  71.         Sols[0] = 1;
  72.         for( int j = 0; j < m; j++ )
  73.             Sol[0][0][j] = 0;
  74.         for( int i = 0; i < n; i++ ) {
  75.             int N = Sols[i&1];
  76.             int& M = Sols[i&1^1];
  77.             int (*Prev)[24] = Sol[i&1];
  78.             int (*Next)[24] = Sol[i&1^1];
  79.  
  80.             M = 0;
  81.             for( int k = 0; k < N; k++ ) {
  82.                 for( int j = 0; j < m; j++ ) {
  83.                     if( j > 0 and Prev[k][j] == Prev[k][j-1] )
  84.                         continue;
  85.  
  86.                     for( int q = 0; q < m; q++ )
  87.                         Next[M][q] = Prev[k][q];
  88.  
  89.                     Next[M][j] += A[i];
  90.                     std::sort(Next[M], Next[M]+m, std::greater<int>());
  91.  
  92.  
  93.                     for( int q = 0; q < m; q++ ) {
  94.                         if( Next[M][q] > C[q] ) {
  95.                             M--;
  96.                             break;
  97.                         }
  98.                     }
  99.  
  100.                     M++;
  101.  
  102.                     if( M >= 1250000 ) {
  103.                         printf("%d\n", m);
  104.                         return 0;
  105.                     }
  106.  
  107.                 }
  108.             }
  109.  
  110.        
  111.         }
  112.         if( Sols[n&1] != 0 )
  113.             break;
  114.     }
  115.     int i = n&1;
  116.  
  117.     if( Sols[i] == 0 ) {
  118.         puts("NIE");
  119.         return 0;
  120.     }
  121.  
  122.     for( int k = 0; k < Sols[i]; k++ ) {
  123.         for( int j = 0; j < m; j++ ) {
  124.             if( Sol[i][k][j] == 0 )
  125.                 m = j;
  126.         }
  127.     }
  128.  
  129.     printf("%d\n", m );
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement