/*此题用的是深搜做的*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int arr[30],vis[30];
int n,m,flag,ans,num;
void dfs(int xx,int yy)
{
int j;
if(xx==0)
{
ans=yy;
flag=1;
return ;
}
if(xx<0)return ;
for(j=0;j<n;j++)
{
if(j==n)return ;//如果已经搜到尽头了还没有结果就返回
if(vis[j]==0&&arr[j]<=xx)//对于比该数大的就不会对其进行取余,节省了很多
{
vis[j]=1;//用完后标记
dfs(xx%arr[j],yy+1);//对其余数进行深搜直到搜到最小结果,搜完一次次数加一
vis[j]=0;//如果此条路不行将其还原为原来状态
}
}
}
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int i;
int t;
cin>>t;
while(t--)
{
flag=0;//作为标记能模0的情况令其为0
memset(vis,0,sizeof(vis));
cin>>n>>num;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
sort(arr,arr+n,cmp);//对输入的数据进行从大到小排序
dfs(num,0);
if(flag==1)
{
cout<<ans<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
return 0;
}
HDU5339 就是杭电bestcoder49第一题
最新推荐文章于 2017-05-01 19:24:05 发布