hdu 5339 递归枚举

只有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 }

 

posted @ 2015-08-03 18:49  hxy_has_been_used  阅读(138)  评论(0编辑  收藏  举报