题目地址:点击打开链接
思路:回溯,就是刚开始要从小到大排序一下,因为先对小数取余再对大数取余没意义,这道题数据比较水,看到有人从大到小枚举过了,随便写了一组数据就测出来错误,却能AC
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
using namespace std;
int n,a[21],visit[21],min1;
void back_sort(int num,int sum)
{
int i;
if(num == 0)
{
min1 = min(sum,min1);
return;//这一句记得要加不然会接着往下执行
}
for(i=1; i<=n; i++)
{
if(visit[i] == 0 && num >= a[i])
{
visit[i] = 1;
back_sort(num%a[i],sum+1);//不能用sum++,不然会错,错误的原因应该是先赋值再加了
visit[i] = 0;
}
}
}
int main()
{
int t,num,i;
scanf("%d",&t);
while(t--)
{
min1 = INT_MAX;
memset(visit,0,sizeof(visit));
scanf("%d%d",&n,&num);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);//注意是从1开始赋值的
back_sort(num,0);
if(min1 != INT_MAX)
printf("%d\n",min1);
else
printf("-1\n");
}
return 0;
}