裴蜀定理: ax+by=gcd(a,b) 必定有解
1. 有无限个数凑不出来
有无限个数凑不出来
2. 最大凑不出的数字
在 的条件下,最大凑不出的数为
推广:若数字数目大于2,gcd仍然为1,最大凑不出来的数字一定小于上面的结论值,即局部采用上面的结论,整体定性判断。
练习
INF的处理采用 结论1
范围的估计采用 结论2
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
bool f[N][N];
int a[N];
int main()
{
int n;
cin >> n;
cin >> a[1];
int gcd = a[1];
for(int i = 2; i <= n; i++)
{
cin >> a[i];
gcd = __gcd(a[i], gcd);
}
if(gcd != 1)
{
cout << "INF" << '\n';
return 0;
}
f[0][0] = true;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= N; j++)
{
f[i][j] = f[i-1][j] || (j >= a[i] ? f[i][j - a[i]] : false);
}
}
int cnt = 0;
for(int i = 0; i <= N; i++)
{
if(!f[n][i]) cnt++;
}
cout << cnt;
return 0;
}