典型的深搜,每次都在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,1313
typedef 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;
}