hdu 5339 Untitled dfs

Problem Description

There is an integer a and n integers b1,…,bn. After selecting some numbers from b1,…,bn in any order, say c1,…,cr, we want to make sure that a mod c1 mod c2 mod… mod cr=0 (i.e., a will become the remainder divided by ci each time, and at the end, we want a to become 0). Please determine the minimum value of r. If the goal cannot be achieved, print −1 instead.

Input

The first line contains one integer T≤5, which represents the number of testcases. 
For each testcase, there are two lines:
1. The first line contains two integers n and a (1≤n≤20,1≤a≤106).
2. The second line contains n integers b1,…,bn (∀1≤i≤n,1≤bi≤106).

Output

Print T answers in T lines.

Sample Input

2

2 9

2 7

2 9

6 7

Sample Output

2

-1

dfs题:不过这题很容易超时。要注意剪枝。剪枝地方我会在代码中说明,看代码就可以了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,b[30],r,mn;
int v[30];
void dfs(int k,int a)
{
    int i,s;
    for (i=1;i<=n;i++)
    {
        if (!v[i])
        {
            s=a%b[i];
            if (s==0) {r=min(r,k+1);return ;}
            if (s<mn) continue; //剪枝。如果s比这些数中最小值还小,那么s就不可能为0.
            v[i]=1;
            dfs(k+1,s);
            v[i]=0;
        }
    }
    return ;
}
int main()
{
    int t,i,a,c,d;
    scanf("%d",&t);
    while (t--)
    {
        r=30;
        scanf("%d%d",&n,&a);
        c=n;
        i=1;
        mn=1000000;
        while (c--)
        {
            scanf("%d",&d);
            if (d>a) continue; //剪枝。a模比a大的数还是a,就可以不用管。
            if (a%d==0) r=1;  //剪枝。如果a是这些数中一些数的倍数,那么最小值就是一。
            b[i++]=d;
            mn=min(mn,d);
        }
        n=i-1;
        sort(b+1,b+i);
        if (r==1) {printf("1\n");continue;}
        memset(v,0,sizeof(v));
        dfs(0,a);
        if (r==30) printf("-1\n");
        else printf("%d\n",r);
    }
}
时间: 2024-10-19 00:41:11

hdu 5339 Untitled dfs的相关文章

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

HDU 5339 Untitled(暴搜)

Untitled Problem Description There is an integer $a$ and $n$ integers $b_1, \ldots, b_n$. After selecting some numbers from $b_1, \ldots, b_n$ in any order, say $c_1, \ldots, c_r$, we want to make sure that $a \ mod \ c_1 \ mod \ c_2 \ mod \ldots \ m

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

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

hdu 5339 Untitled【搜索】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5339 题意:一个整数a 和一个数组b.问你能否在b中取出r个元素排列组成c数组满足a%c1%c1%-..%cr == 0.输出最小的r,不能满足条件输出-1. 思路:b按从大到小排序,暴搜. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include

Hdu 5339 Untitled (数学思维)

题意:给一个数a和n个数b1,b2,...,bn. 从n个数中选择一些数重新排列成c1,c2,...,cm使得a%c1%c2%...%cm=0. 如果能选出则输出最少需要几个数,否则输出-1. 分析: 首先很重要的一点就是 “一定是先除大的数再除小的数” 因为如果先除小的数x,则取模的数一定是在0到x-1中,再除大于x的数是没意义的. 即选出的一列数是非递增序列. 由于n最多只有20个,简单的2^n的搜索即可搞定了. 通过这题发现hdu oj的一个bug 就是排序的时候不能手写整数的cmp使其逆

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

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 =

DFS HDOJ 5339 Untitled

题目传送门 1 /* 2 DFS:从大到小取模,因为对比自己大的数取模没意义,可以剪枝.但是我从小到大也过了,可能没啥大数据 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-1 18:57:52 7 File Name :A.cpp 8 *************************************************/ 9