[蓝桥杯][2017年第八届真题]包子凑数

完全背包。

对于(a_1x_1+a_2x_2+a_3x_3+cdots+a_nx_n=c)

  1. 如果(a_1,a_2,a_3,cdots,a_n)互质,(x_1,x_2,x_3,cdots,x_n)一定有解且有无穷多个。但此时导致方程无解的(c)的个数有限,也就是凑不出的包子数目有限。
  2. 如果(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;
}

原文地址:https://www.cnblogs.com/fxh0707/p/14668409.html