博客
关于我
蓝桥杯包子凑数(贝祖定理-动态规划)
阅读量:365 次
发布时间:2019-03-04

本文共 1858 字,大约阅读时间需要 6 分钟。

1. 问题描述:

小明几乎每天早晨都会在一家包子铺吃早餐。这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买X个包子,卖包子的大叔就会选出若干笼包子来,使得这若干笼中恰好一共有X个包子。 比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。 

当然有时包子大叔无论如何也凑不出顾客想买的数量。 比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。 小明想知道一共有多少种数目是包子大叔凑不出来的。 

输入

第一行包含一个整数N。(1 <= N <= 100) 

以下N行每行包含一个整数Ai。(1 <= Ai <= 100)   

输出

输出一行包含一个整数代表答案。如果凑不出的数目有无限多个,输出INF。

样例输入

2

4
5

样例输出

6

来源:

2. 思路分析:

① 一开始的时候没有什么思路,于是在网上查找了一下解题思路发现这道题目考查的是扩展欧几里得算法相关的知识点,其中使用到了贝祖定理,贝祖定理的描述为:如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。(可以来判断一个这样的式子有没有解)其中一个比较常用的是如果ax+by=1有解,那么gcd(a,b)=1;下面是我对于网上思路的理解。

② 如果题目中给出的每笼包子数目的最大公约数不等于1那么就就会导致无限多个不是gcd(A1,A2,A3...An)倍数的数t使得A1x1 + A2y1 +.... = t 是不存在x1,y1,z1....使得方程具有整数解的这个时候凑不出的包子的数目是存在无限多个的,所以只有当gcd(A1,A2,A3...An) = 1的时候那么m是1的m倍肯定是存在整数解的,所以我们首先需要求解的是所有包子数目的最大公约数如果发现不是1那么肯定存在无限个凑不出的数目的包子直接输出INF即可,如果最大公约数为1那么说明A1x1 + A2y1 +.... = m是整数解的因为这个时候m是1的m倍,当有解的时候就相当于是我有若干个不同重量物品,并且当前最大的背包容量是固定的(这个感觉是由于题目的数据量决定的),通过放置这些物品求解出哪些容量通过这些物品凑不出来的,我们其实可以声明一个长度为10005的列表(根据数据规模大概确定在这个范围吧)通过两层循环来在最大背包容量的情况下放置无限多个物品,如果当前容量能够放置物品那么将这个位置的dp列表值置为1,最终计算出列表中置为1的数目那么就是不能够凑出的包子的数目。

3. 代码如下:

# 计算a与b的最大公约数def gcd(a: int, b: int):    return a if b == 0 else gcd(b, a % b)if __name__ == '__main__':    N = int(input())    baozi = list()    for i in range(N):        baozi.append(int(input()))    g = baozi[0]    for i in range(1, N):        g = gcd(g, baozi[i])    if g != 1:        print("INF")    else:        dp = [0] * 100005        # 第一个数字为1        dp[0] = 1        for i in range(N):            j = 0            while j + baozi[i] < 100001:                # 只有当前位置的值存在的时候通过放置当前的包子那么对应容量的位置置为1                if dp[j]:                    dp[j + baozi[i]] = 1                j += 1        res = 0        for i in range(1, 100001):            if dp[i] == 0:                res += 1        print(res)

 

转载地址:http://dbwg.baihongyu.com/

你可能感兴趣的文章
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>