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 <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <deque>
 9 #include <vector>
10 #define INF 0x7f7f7f7f
11 #define pii pair<int,int>
12 #define LL unsigned long long
13 using namespace std;
14 const int N=110;
15 int a[N];
16 int n, m;
17 int ans;
18 bool tag[N];
19 
20 
21 void DFS(int num, int cnt)
22 {
23     if(num==n)
24     {
25         int tmp=m;
26         for(int i=n-1; i>=0; i--)
27         {
28             if(tag[i])
29             {
30                 tmp%=a[i];
31             }
32         }
33         if(!tmp)
34         {
35             ans=min(cnt, ans);
36         }
37         return;
38     }
39 
40     tag[num]=0;
41     DFS(num+1, cnt );
42 
43     tag[num]=1;
44     DFS(num+1, cnt+1);
45 }
46 
47 
48 int main()
49 {
50     //freopen("input.txt", "r", stdin);
51     int   b, d, L, U, t, q;
52     cin>>t;
53     while(t--)
54     {
55         ans=INF;
56         memset(tag,0,sizeof(tag));
57 
58         scanf("%d%d", &n, &m);
59         for(int i=0; i<n; i++)    scanf("%d", &a[i]);
60 
61         sort(a, a+n);
62         DFS(0, 0);
63         if(ans==INF)
64             cout<<"-1"<<endl;
65         else
66             cout<<ans<<endl;
67     }
68     return 0;
69 }
AC代码

 

posted @ 2015-08-01 22:52  xcw0754  阅读(194)  评论(0编辑  收藏  举报