HDU 5339Untitled

来源:互联网 发布:中孚网络隔离卡驱动 编辑:程序博客网 时间:2024/05/05 00:10

典型的深搜,每次都在b数组中去找一个小于等于a的数进行取模运算。

注意:在判断条件中要有now>=b[i],这也算是一个小小的剪枝吧,没有的话会超时,我第一次就T在这了。

贴代码:

#include <algorithm>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <ctype.h>#include <iostream>#include <map>#include <queue>#include <set>#define eps 1e-8#define INF 0x7fffffff#define PI acos(-1.0)#define seed 31//131,1313typedef long long LL;typedef unsigned long long ULL;using namespace std;int n,a;int r;int b[25];int Flag;int visited[25];void DFS(int now,int cnt){   if(now==0){     Flag=1;     if(cnt<r){        r=cnt;     }     return;   }   if(cnt==n) return;   for(int i=0;i<n;i++){     if(!visited[i]&&now>=b[i]){  //DFS要注意适当的剪枝,                               //否则很有可能超时,这里注意条件now>=b[i]        visited[i]=1;        DFS(now%b[i],cnt+1);        visited[i]=0;     }   }}int main(){    int t;    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&a);        for(int i=0;i<n;i++)          scanf("%d",&b[i]);        memset(visited,0,sizeof(visited));        Flag=0;        r=n;        DFS(a,0);        if(!Flag) printf("-1\n");        else printf("%d\n",r);    }    return 0;}
0 0