题目地址
解题思路
首先呢如果n个数的最大公约数不为1,那他们不凑的数字肯定无情多个。因为n个数字的最小公倍数就是最大公约数的倍数。
如果最大公约数为1,就使用完全背包解题即可。
AC代码
#include <iostream>
using namespace std;
int num[110*110], a[200];
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a%b);
}
int main()
{
int n, gcdnum, ans = 0;
cin >> n;
for (int i=0; i<n; i++)
cin >> a[i];
gcdnum = gcd(a[0], a[1]);
for (int i=2; i<n; i++)
gcdnum = gcd(a[i], gcdnum);
if (gcdnum != 1)
{
cout << "INF" << endl;
return 0;
}
num[0] = 1;
for (int i=0; i<n; i++)
{
for (int j=a[i]; j<=10005; j++)
{
num[j] = max(num[j], num[j-a[i]]);
}
}
for (int i=1; i<=10005; i++)
{
if (num[i] == 0)
ans++;
}
cout << ans << endl;
return 0;
}