只有20个点,从大到小排序然后枚举即可。这里做了一个优化,不模大于自己的数,因为这是徒劳的,我们要求的是最小的r。
注意:不排序就枚举是错误的,想一想,为什么。
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int INF = 99; 8 const int N = 20; 9 int x[N]; 10 int t, n, a, r; 11 12 bool cmp( int p, int q ) 13 { 14 return p > q; 15 } 16 17 void dfs( int d, int cur, int len ) 18 { 19 if ( d == 0 ) 20 { 21 r = min( r, len ); 22 return ; 23 } 24 if ( cur == n ) return ; 25 if ( d >= x[cur] ) dfs( d % x[cur], cur + 1, len + 1 ); 26 dfs( d, cur + 1, len ); 27 } 28 29 int main () 30 { 31 cin >> t; 32 while ( t-- ) 33 { 34 cin >> n >> a; 35 for ( int i = 0; i < n; i++ ) 36 { 37 cin >> x[i]; 38 } 39 sort( x, x + n, cmp ); 40 r = INF; 41 dfs( a, 0, 0 ); 42 if ( r == INF ) r = -1; 43 cout << r << endl; 44 } 45 return 0; 46 }
时间: 2024-10-12 07:48:42