[蓝桥杯][2017年第八届真题]包子凑数
完全背包。
对于\(a_1x_1+a_2x_2+a_3x_3+\cdots+a_nx_n=c\)
- 如果\(a_1,a_2,a_3,\cdots,a_n\)互质,\(x_1,x_2,x_3,\cdots,x_n\)一定有解且有无穷多个。但此时导致方程无解的\(c\)的个数有限,也就是凑不出的包子数目有限。
- 如果\(a_1,a_2,a_3,\cdots,a_n\)不互质,那么就有无穷多个\(c\)使得方程无解,也就是有无穷多个包子数目凑不出来,所以输出INF。
用\(f[i]=1\)表示第\(i\)个整数能够被计算出。
const int N=110,M=10010;
int a[N];
int f[M];
int n;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
cin>>n;
int d=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
d=gcd(d,a[i]);
}
if(d > 1) puts("INF");
else
{
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=a[i];j<M;j++)
f[j] |= f[j-a[i]];
int res=0;
for(int i=1;i<M;i++)
if(!f[i])
res++;
cout<<res<<endl;
}
//system("pause");
return 0;
}