[蓝桥杯][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;
}

posted @ 2021-04-16 19:01  Dazzling!  阅读(129)  评论(0编辑  收藏  举报