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 }
时间: 2024-10-12 07:48:42

hdu 5339 递归枚举的相关文章

Swift枚举-相关值与递归枚举

代码: enum ArithmeticExpression { // 相关值 case Number(Int) // 递归枚举 indirect case Addition(ArithmeticExpression, ArithmeticExpression) indirect case Multiplication(ArithmeticExpression, ArithmeticExpression) indirect case Division(ArithmeticExpression, A

BestCoder #49 Untitled HDU 5339

BestCoder #49 Untitled  HDU 5339 题目: http://acm.hdu.edu.cn/showproblem.php?pid=5339 本题采用深搜, 数据量小,先做排序处理(降序), 然后深搜的时候,进行剪枝,比K大的数就没必要往后搜索,直接剪掉. #include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int INF =

poj1416——dfs递归枚举+记录路径

POJ 1416  dfs递归枚举+记录路径 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4456   Accepted: 2555 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" s

hdu 5339 Untitled(回溯)

hdu 5339 Untitled 题目大意:给出n个数字的序列,和一个数a,在n中有m个数b1,...,bm使得__a %b1%b2%...%bm = 0,求最小的m. 解题思路:回溯. #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; const int N = 5

poj2531——dfs递归枚举+小剪枝

POJ 2531  dfs递归枚举 Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9580   Accepted: 4560 Description A university network is composed of N computers. System administrators gathered information on the traffic between nodes

C++ 全排列问题——递归枚举法

全排列问题是一道非常经典的递归题目,而递归枚举法求解也是最暴力的一种方法. 例题 洛谷1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 一个整数n. 输出格式 由1-n组成的所有不重复的数字序列,每行一个序列. 每个数字保留 5个场宽. 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 全排列问题--递归枚举法 这是一道经典的递归的题,每次递归枚举第x个数字是几,就是从1到

HDU 5339 Untitled (状态压缩枚举)

Untitled Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 570    Accepted Submission(s): 291 Problem Description There is an integer a and n integers b1,-,bn. After selecting some numbers from b

HDU 5339 Untitled (递归穷举)

题意:给定一个序列,要求从这个序列中挑出k个数字,使得n%a1%a2%a3....=0(顺序随你意).求k的最小值. 思路:排个序,从大的数开始模起,这是因为小的模完还能模大的么? 每个元素可以选,也可以不选,两种情况.递归穷举每个可能性,O(2n). 1 //#include <bits/stdc++.h> 2 #include <cstdio> 3 #include <cstring> 4 #include <map> 5 #include <al

hdu 5339 Untitled

Untitled Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 166    Accepted Submission(s): 83 Problem Description There is an integer a and n integers b1,-,bn. After selecting some numbers from b1