题解
找到所有数的最大公约数,如果这个数大于1,则说明一定会有数是凑不出来的,即INF,否则的话,用dp去寻找每个数是否能被凑出来,若j-a[i]可以被凑出来,则j一定可以被凑出来,状态转移。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
ll n;
ll a[105];
ll ans;
ll g;
ll dp[1000005];//因为n是1e2 所以这里可以开1e6
int flag=1;
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}g=a[1];for(int i=2;i<=n;i++){g=__gcd(g,a[i]);//寻找所有数的最大公约数}if(g>1)//如果大于1了 肯定有无数个数找不到{flag=0;}dp[0]=1;if(flag){for(int i=1;i<=n;i++){for(int j=a[i];j<=1000000;j++){dp[j]=max(dp[j],dp[j-a[i]]);//j可以由j-a[i]转移过来}}for(int i=1;i<=1000000;i++){if(dp[i]==0){ans++;}}cout<<ans<<endl;}else{cout<<"INF"<<endl;}return 0;
}