[HDOJ5339]Untitled

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5339

给你n个数字b1...bn和一个数字a,让你用a对b1...bn内的数字取模,求取模后值为0的最少的数。可以重复b内取值。

首先明确一点,那就是一个数对一个较小数取模后再对一个较大数取模是没有任何意义的。因此重复取值是没有意义的,所以对数组b从大到小进行排序。

之后状态压缩后枚举b内数字就可以了。也可以DFS出结果。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <queue>
 8 #include <map>
 9 #include <stack>
10 #include <list>
11 #include <vector>
12 
13 using namespace std;
14 
15 const int maxn = 100010;
16 const int INF = 1<<30;
17 int n, a;
18 int b[maxn];
19 
20 inline int min(int a, int b) {
21     return a < b ? a : b;
22 }
23 int main() {
24     // freopen("in", "r", stdin);
25     int T;
26     scanf("%d", &T);
27     while(T--) {
28         int ans = INF;
29         scanf("%d %d", &n, &a);
30         for(int i = 0; i < n; i++) {
31             scanf("%d", &b[i]);
32         }
33         sort(b, b+n, greater<int>());
34         int s = (1 << n);
35         int cnt;
36         for(int i = 1; i < s; i++) {
37             int tmp = a;
38             cnt = 0;
39             for(int j = 0; j < n; j++) {
40                 if(i & (1 << j)) {
41                     tmp %= b[j];
42                     cnt++;
43                 }
44             }
45             if(tmp == 0) {
46                 ans = min(ans, cnt);
47             }
48         }
49         if(ans == INF) {
50             printf("-1
");
51         }
52         else {
53             printf("%d
", ans);
54         }
55     }
56 }
原文地址:https://www.cnblogs.com/kirai/p/4783047.html