首页 > 其他分享 >P8646 [蓝桥杯 2017 省 AB] 包子凑数

P8646 [蓝桥杯 2017 省 AB] 包子凑数

时间:2023-12-22 17:23:30浏览次数:50  
标签:凑数 AB return gcd int 蓝桥 ++ ai dp

根据裴蜀定理可得INF的情况是所有数的最大公约数非1

而我们的完全背包的上限是多少呢?

设置为Σai即可,因为把每一个ai用上之后的集合,和ai可以重复使用的集合,只差了整数倍个ai,因此可达性是完全一致的,这里N<=100,ai<=100,所以我们把这个背包的上限设置为10000.

#include <bits/stdc++.h>
using namespace std;
int gcd(int m, int n)
{
    if(n)
    {
        return gcd(n, m % n);
    }
    else
    {
        return m;
    }
}//求gcd(m,n),常见的递归写法
const int MAXN = 105, MAX_DP = 100005;//又来定义
int n, a[MAXN], dp[MAX_DP], ans;
bool notCoprime(int *arr)//返回arr数组中所有数的最大公约数是否大于1
{
    int g = arr[0];
    for(int i = 1; i < n; i++)
    {
        g = gcd(g, arr[i]);
        if(g == 1)
        {
            return false;//如果g已经为1,不用再循环,直接返回
        }
    }
    return g > 1;
}//定义函数,运行更快
int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }//输入
    if(notCoprime(a))//如果gcd({A_i})>1
    {
        printf("INF");
        return 0;//直接结束
    }
    dp[0] = 1;//注意0是被认为能被凑出的,否则所有数都凑不出来,循环检查时可以不用从0开始
    for(int i = 0; i < n; i++)
    {
        for(int j = a[i]; j < MAX_DP; j++)
        {
            dp[j] = max(dp[j], dp[j - a[i]]);//状态转移方程
        }
    }
    for(int i = 1; i < MAX_DP; i++)
    {
        if(!dp[i])
        {
            ans++;//如果dp[i]=0,多一个凑不出的数
        }
    }
    printf("%d", ans);//输出
    return 0;
}

还有大佬的剩余类最短路做法(可以更好的解释为什么那个完全背包的上限设置为Σai)

#include <queue>
#include <cstdio>
#include <cstring>
#define P pair<int, int>
using namespace std;
struct E
{
    int v, w, t;
} e[10050];
int n, c, z, a[150], d[150], h[150];
bool b[150];
priority_queue<P, vector<P>, greater<P>> q;
void A(int u, int v, int w)
{
    e[++c] = {v, w, h[u]};
    h[u] = c;
}
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", a + i);
    for (int i = 0; i < a[1]; ++i)
        for (int j = 2; j <= n; ++j)
            A(i, (i + a[j]) % a[1], a[j]);
    memset(d, 0x3f, sizeof d);
    q.emplace(d[0] = 0, 0);
    while (!q.empty())
    {
        int u = q.top().second;
        q.pop();
        if (!b[u])
        {
            b[u] = 1;
            for (int i = h[u], v; i; i = e[i].t)
                if (d[v = e[i].v] > d[u] + e[i].w)
                    q.emplace(d[v] = d[u] + e[i].w, v);
        }
    }
    for (int i = 0; i < a[1]; ++i)
    {
        if (d[i] == 0x3f3f3f3f)
            return !puts("INF");
        z += d[i] / a[1];
    }
    printf("%d", z);
    return 0;
}

 

标签:凑数,AB,return,gcd,int,蓝桥,++,ai,dp
From: https://www.cnblogs.com/smartljy/p/17922039.html

相关文章

  • centos下Iptables的安装(离线)
    背景:要给公司服务器屏蔽端口,然后开服务IP白名单,修改完iptables文件后,想执行指令生效,发生指令不存在vim/etc/sysconfig/iptables-AINPUT-s10.xx.xx.xx/24-ptcp-mtcp--dport8888-jACCEPT-AINPUT-s10.xx.xx.xx/24-ptcp-mtcp--dport9999-jACCEPT然后重......
  • QTabWidget小案例
    一、概述编写一个QTabWidget小案例,示例图:  二、代码示例#include"TabWidgetExampleWindow.h"TabWidgetExampleWindow::TabWidgetExampleWindow(QWidget*parent):QWidget(parent){this->setWindowTitle("TabLayout布局");QVBoxLayout*vLayo......
  • 【每周例题】蓝桥杯 C++ 区间最大和
    区间最大和题目蓝桥杯区间最大和题目分析  这道题涉及到了区间问题,我们首先要了解规定的该区间范围:1<p且p+k一1<n,我们将其转化:1<p<n-k+1,当我们得到这个区间的时候,需要求该区间的最大和可以用双重for循环搞定。代码 #include<iostream>usingnamespacestd;int......
  • zabbix5.0监控postgresql13.6
    环境描述zabbix版本:5.0.12PG版本:13.6监控需求监控postgresql运行情况(非核心业务,主要监控挂没挂)监控流复制运行情况如有异常,则告警具体步骤在postgresql上创建监控用户,授权,并配置pg_hba.conf文件允许通过该用户去访问到zabbix的网站上下载监控脚本将脚本部署在po......
  • Js 之treeTable树状表格
    一、下载/**树形表格3.xCreatedbywangfanon2020-05-12https://gitee.com/whvse/treetable-lay*/layui.define(['laytpl','form','util'],function(exports){var$=layui.jquery;varlaytpl=layui.laytpl;varform......
  • Android应用开发长按拖拽-Flutter的LongPressDraggable控件回调函数onDraggableCancel
    onDraggableCanceled介绍LongPressDraggable的onDraggableCanceled回调在拖动被取消时触发。拖动可能会被取消,例如用户在拖动开始后移动了太快或在放置之前取消了拖动。onDraggableCanceled的使用以下是如何使用onDraggableCanceled的示例:LongPressDraggable<int>(//......
  • 巧妙使用Vue.extend继承组件实现el-table双击可编辑(不使用v-if和v-else)
    问题描述有一个简单的表格,产品要求实现双击可编辑看了一下网上的帖子,大多数都是搞两部分dom,一块是输入框,用于编辑状态填写;另一块是普通标签,用于在不编辑显示状态下呈现单元格文字内容。再加上一个flag标识搭配v-if和v-else去控制编辑状态、还是显示状态。大致代码如下:<el-t......
  • matlab图像基础知识
    1.MATLAB支持的几种图像文件格式:⑴JPEG(JointPhotogyaphicExpeytsGroup):一种称为联合图像专家组的图像压缩格式。⑵BMP(WindowsBitmap):有1位、4位、8位、24位非压缩图像,8位RLE(RunlengthEncoded)的图像。文件内容包括文件头(一个BITMAPFILEHEADER数据结构)、位图信息数据块(位图信......
  • MATLAB图像处理工具箱
    表1图像显示函数名功能说明函数名功能说明colorbar颜色条显示montage按矩形剪辑方式显示多帧图像getimage从坐标系中获取图像数据immovie从多帧索引图像中制作电影image建立显示图像movie播放电影subimage在同一图像窗口显示多个图像trueszie调整图像显......
  • java 1.0的版本遗留 java.util.Hashtable为什么t要小写?
    实际上,Hashtable类是Java1.0版本就引入的,这是Java最早的版本之一。Hashtable是Java早期集合框架的一部分,那时还没有现在我们熟悉的java.util.Collection接口和后来的集合框架。Java1.2版本引入了新的集合框架,其中包含了诸如ArrayList,HashMap,和HashSet等现代......