f[i][j]=min{f[i−1][j]+a[i].g+a[i].grow∗k不选f[i−1][j−1]+a[i].grow∗(k−j)选f[i][j]=min\left\{\begin{matrix}f[i-1][j]+a[i].g+a[i].grow*k &不选\\ f[i-1][j-1]+a[i].grow*(k-j)&选\end{matrix}\right. f [ i ] [ j ] = m i n { f [ i − 1 ] [ j ] + a [ i ] . g + a [ i ] . g r o w ∗ k f [ i − 1 ] [ j − 1 ] + a [ i ] . g r o w ∗ ( k − j )  不 选 选  #include <cstdio>  
#include <iostream>  
#include <algorithm>  
#include <cstring>  
using  namespace  std; 
int  ans, n, h, f[ 55 ] [ 55 ] ; 
struct  rec
{ int  grow, g; 
} a[ 55 ] ; 
bool  cmp ( rec x, rec y) 
{ return  x. grow< y. grow; 
} 
int  main ( ) 
{ ans= - 1 ; scanf ( "%d %d" , & n, & h) ; for  ( int  i= 1 ; i<= n; ++ i) scanf ( "%d" , & a[ i] . g) ; for  ( int  i= 1 ; i<= n; ++ i) scanf ( "%d" , & a[ i] . grow) ; sort ( a+ 1 , a+ 1 + n, cmp) ; for  ( int  k= 0 ; k<= n; ++ k) { for  ( int  i= 1 ; i<= n; ++ i) for  ( int  j= 1 ; j<= i; ++ j) f[ i] [ j] = 2147483647 ; for  ( int  i= 1 ; i<= n; ++ i)  f[ i] [ 0 ] = f[ i- 1 ] [ 0 ] + a[ i] . g+ a[ i] . grow* k; for  ( int  i= 1 ; i<= n; ++ i) for  ( int  j= 1 ; j<= k; ++ j) f[ i] [ j] = min ( f[ i- 1 ] [ j] + a[ i] . g+ a[ i] . grow* k, f[ i- 1 ] [ j- 1 ] + a[ i] . grow* ( k- j) ) ; if  ( f[ n] [ k] <= h) { ans= k; break ; } } printf ( "%d" , ans) ; return  0 ; 
}