![](https://i-blog.csdnimg.cn/direct/c04b37ab16614e43aacdc9bc3a98c4c3.jpeg)
![](https://i-blog.csdnimg.cn/direct/145cb81db5a4475a945efe3a3902a51b.jpeg)
cpp
#include<iostream>
using namespace std;
int gcd(int a,int b) {
int tmp;
if (a<b) {
tmp = a;
a = b;
b = tmp;
}
return b == 0 ? a : gcd(b,a%b);
}
int main() {
int dp[10001],n;
memset(dp,0,sizeof(dp));
cin >> n;
int* a = new int[n];
int g,maxn = 0;
for (int i = 0; i < n;i++) {
cin >> a[i];
if (i == 0) {
g = a[i];
}
else {
g = gcd(g,a[i]);
}
maxn = max(maxn, a[i]);
}
if (g != 1) {
cout << "INF";
return 1;
}
dp[0] = 1;
for (int i = 0; i < n;i++) {
for (int j = a[i]; j < 10001;j++) {
dp[j] = (dp[j]>0||dp[j-a[i]]>0)?1:0;
}
}
for (int i = 10001/2; i>0;i/=2) {
int cnt = 0;
for (int j = i; j > i - maxn;j--) {
if (dp[j] == 1) {
cnt++;
}
}
if (cnt != maxn) {
int ans = 0;
for (int z = 1; z <= i * 2;z++) {
if (!dp[z]) {
ans++;
}
}
cout << ans;
return 0;
}
}
return 0;
}