这破题把我整的自闭了,几天都没想出来,看博客也很烦躁,但是当心静下来以后,就会觉得:原来这么简单!!!
所以心态真的很重要!!!
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<set>
using namespace std;
#define ll long long
const int maxn=200;
int a[maxn];
int f[10010]; ///注意数据范围:Nmax*Amax==10000
int gcd(int a,int b) ///求最大公约数
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
int num=a[i];
f[num]=1; ///将每种蒸笼所能放的包子数标记一下
}
int x=a[1];
for(int i=2;i<=n;i++)
{
x=gcd(x,a[i]);
}
if(x!=1) ///如果最大公约数不为1,则有无限多个解
{
printf("INF\n");
}
else
{
int ans=0;
for(int i=1;i<=10005;i++)
{
if(f[i]!=0)
{
for(int j=1;j<=n;j++)
{
int num=a[j];
f[i+num]=1;///如果f[i]可以,则f[i+a[i]] 也可以
}
}
}
for(int i=1;i<=10000;i++)
{
if(f[i]==0) //没有被标记的就是凑不出来的
{
ans++;
}
}
printf("%d\n",ans);
}
}