标签:
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); } }
标签:
原文地址:http://www.cnblogs.com/pblr/p/4714612.html