蓝桥杯练习-----包子凑数

 首先要知道什么情况下是凑不出无限个自然数的---即输出INF

分析:

当输入的数组中所有数字的公共最大因子不为1的时候,假设为x,那么就可以提取出公因子x,

N=\sum ai*ki=x\sum bi*ki,这种情况下N只能是x的倍数,有无限个数是不能凑出的。

然后就是暴力遍历,有别的方法的大佬可以补充!

#include <bits/stdc++.h>
using namespace std;

int n;
int a[101];
bool dp[10001]{false};

int gcd(int a, int b)
{
    if (a < b)
    {
        a = a + b;
        b = a - b;
        a = a - b;
    }

    int res;
    while (b)
    {
        res = a % b;
        a = b;
        b = res;
    }
    return a;
}

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);

    int share = gcd(a[1], a[2]);
    for (int i = 3; i <= n; i++)
        share = gcd(share, a[i]);//这里就是求最大公因子

    if (share != 1)
    {
        cout << "INF" << endl;
        return;
    }

    dp[0] = true;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j + a[i] <= 10000; j++)
        {
            if (dp[j])
            {
                dp[j + a[i]] = true;
            }
        }
    }
    int c = 0;
    for (int i = 1; i <= 10000; i++)
    {
        if (!dp[i])
            c++;
    }
    cout << c << endl;
}

int main(void)
{
    solve();
    // cout << gcd(96, 75) << endl;
    //system("pause");
    return 0;
}

结语:

感觉这题只涉及到最大公因子的代码,然后就是思考什么情况下得INF这两点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值