巧用数论与动态规划破解包子凑数问题

本文针对“包子凑数”问题,深入解析如何通过最大公约数(GCD)判断无法组成的数目是否无限,并结合动态规划高效求解有限情况下的具体数目。通过清晰的算法思路、代码实现及示例详解,揭秘数论与动态规划在组合问题中的巧妙应用,帮助读者掌握核心解题技巧。文章还包含复杂度分析与关键注意事项,适合算法学习者和编程爱好者阅读。

题目描述

小明想知道包子铺用给定的蒸笼规格能凑出多少种无法组成的包子数目。若无法组成的数目无限,输出 INF

输入格式

  • 第一行为整数 N N N(蒸笼种数)
  • 接下来 N N N 行每行一个整数 A i A_i Ai(每种蒸笼的包子数)

输出格式

  • 无法凑出的数目个数,若无限则输出 INF

问题分析

关键条件

若所有 A i A_i Ai 的最大公约数(GCD)不为 1,则无法组成的数目无限。例如,当所有数均为偶数时,无法组成任何奇数。

动态规划思路

当 GCD 为 1 时,使用动态规划判断每个数是否能被组成:

  • 定义 dp[i] 表示能否凑出 i 个包子。
  • 状态转移:若存在某个 A j A_j Aj 使得 dp[i - A_j] 为真,则 dp[i] 为真。

解题步骤

  1. 计算 GCD:若 GCD ≠ 1,直接输出 INF
  2. 动态规划求解:遍历 1 到 100000,统计无法组成的数目。

代码实现

#include<iostream>
#include<algorithm>
using namespace std;int N;
int num[110];
bool dp[100010];  // dp[i]表示能否组成i个包子// 计算最大公约数
int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);
}int main() {cin >> N;int g = 0;  // 初始GCD为0for (int i = 1; i <= N; ++i) {cin >> num[i];g = gcd(g, num[i]);  // 更新GCD}// 若所有数的GCD不为1,输出INFif (g != 1) {cout << "INF" << endl;return 0;}dp[0] = true;  // 0个包子可以凑出// 动态规划填充数组for (int i = 1; i <= 100000; ++i) {for (int j = 1; j <= N; ++j) {if (i >= num[j] && dp[i - num[j]]) {dp[i] = true;  // 标记当前数目可凑}}}// 统计无法凑出的数目int res = 0;for (int i = 1; i <= 100000; ++i) {if (!dp[i]) ++res;}cout << res << endl;return 0;
}

复杂度分析

  • 时间复杂度 O ( N × M ) O(N \times M) O(N×M),其中 M = 1 0 5 M=10^5 M=105 为遍历的最大数, N N N 为蒸笼种数。
  • 空间复杂度 O ( M ) O(M) O(M),存储动态规划状态。

示例解释

样例输入1

2  
4  
5

输出:6
解释:无法凑出的数为 1, 2, 3, 6, 7, 11。

样例输入2

2  
4  
6

输出:INF
解释:所有奇数无法凑出,数目无限。

总结

本题结合数论(GCD判断)与动态规划,需注意:

  1. 先通过 GCD 判断是否为无限情况。
  2. 动态规划时需覆盖足够大的范围以确保正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是数据

一、数据的本质定义​​ ​​哲学视角​​ 亚里士多德《形而上学》中"未加工的观察记录"现代认知科学&#xff1a;人类感知系统接收的原始刺激信号&#xff08;如视网膜光信号、听觉神经电信号&#xff09;信息论奠基人香农&#xff1a;消除不确定性的度量载体 ​​…

FreeRTOS中互斥量实现数据共享优化

在 FreeRTOS 中&#xff0c;当读操作远多于写操作时&#xff0c;使用**互斥量&#xff08;Mutex&#xff09;会导致读任务频繁阻塞&#xff0c;降低系统性能。此时&#xff0c;可以通过实现读者-写者锁&#xff08;Reader-Writer Lock&#xff09;**优化&#xff0c;允许多个读…

国内虚拟电厂(VPP)管控平台供应商

以下是几家专注于虚拟电厂业务的供应商及其官网地址&#xff1a; 1. 华茂能联科技有限公司 官网地址&#xff1a;https://huamod.com/简介&#xff1a;华茂能联是分布式资源管理与虚拟电厂产品与服务提供商&#xff0c;团队汇聚了来自美国、欧洲和国内多个行业知名研究机构或…

协方差相关问题

为什么无偏估计用 ( n − 1 ) (n-1) (n−1) 而不是 n n n&#xff0c;区别是什么&#xff1f; 在统计学中&#xff0c;无偏估计是指估计量的期望值等于总体参数的真实值。当我们用样本数据估计总体方差或协方差时&#xff0c;分母使用 ( n − 1 ) (n-1) (n−1) 而不是 n n…

算法设计学习6

实验目的及要求&#xff1a; 目标是使学生学会分析数据对象的特点&#xff0c;掌握数据组织的方法和在计算机中的存储方式&#xff0c;能够对具体问题中所涉及的数据选择合适的逻辑结构、存储结构&#xff0c;进而在此基础上&#xff0c;对各种具体操作设计高效的算法&#xff…

Java 三大特性—多态

目录 1、多态的概念2、多态的条件3、向上转型3.1 概念3.2 使用场景 4、向下转型5、多态的优缺点 1、多态的概念 多态&#xff0c;通俗来讲就是多种形态&#xff0c;即对于同样的行为&#xff0c;不同的对象去完成会产生不同的状态。比如动物都会吃东西&#xff0c;小狗和小猫都…

Ubuntu 24.04 LTS系统安装RTX 4090显卡驱动和cuda并部署ollama下载DeepSeek模型【自用详细版】

自己捣鼓玩玩哈&#xff0c;正好有机子 1. 安装驱动前的系统配置工作 卸载原有驱动并禁用nouveau sudo apt remove --purge nvidia*sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.backup //备份文件sudo vim /etc/modprobe.d/blacklist.conf //修…

【一篇搞定配置】一篇带你从配置到使用(PyCharm远程)完成服务器运行项目(配置、使用一条龙)【全网最详细版】

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

Mamba模型

为什么要提出mamba模型&#xff1f; transformer特点&#xff1a;训练快&#xff0c;推理慢&#xff0c;计算成本O&#xff08;n*n&#xff09; Rnn的特点&#xff1a;训练慢&#xff0c;推理快&#xff0c;容易遗忘 其实很容易理解&#xff0c;因为RNN的输入只包含前一个隐…

如何在 Windows 11 上查找计算机的 IP 地址?

原文&#xff1a;如何在 Windows 11 上查找计算机的 IP 地址&#xff1f; | w3cschool笔记 在开始之前&#xff0c;我们先来了解一下什么是 IP 地址&#xff1a; 假设你住在一栋公寓楼里&#xff0c;快递员需要把包裹送到你家。为了确保快递能准确送到&#xff0c;你需要提供…

2.Spring-注解开发定义bean/纯注解开发/Spring整合MyBatis(p21-p30)

&#xff08;一&#xff09;注解开发定义bean &#xff08;二&#xff09;纯注解开发 &#xff08;三&#xff09;bean的作用范围 &#xff08;三&#xff09;xml配置和注解配置 &#xff08;四&#xff09;Spring整合MyBatis 要在pom.xml定义一下坐标。org.spr…

解决:Fontconfig head is null, check your fonts or fonts configurat

文章目录 问题解决方案安装字体依赖包强制刷新字体缓存验证是否生效 个人简介 问题 在使用 Java 环境部署或运行图形相关应用时&#xff0c;比如图片验证码&#xff0c;偶尔会遇到如下报错&#xff1a; Fontconfig head is null, check your fonts or fonts configurat意味当…

『不废话』之Llama 4实测小报

2025年4月5日Llama 4一开源&#xff0c;随后OpenRouter等平台就提供免费调用。对于中文社区来&#xff0c;官方的测评结果其实意义不大&#xff08;原因先按下不表&#xff09;&#xff0c;就看知乎、微博、B站、twitter上的真实感受&#xff0c;最重要的是自己的真实案例测评。…

【NLP 56、实践 ⑬ LoRA完成NER任务】

目录 一、数据文件 二、模型配置文件 config.py 三、数据加载文件 loader.py 1.导入文件和类的定义 2.初始化 3.数据加载方法 代码运行流程 4.文本编码 / 解码方法    ① encode_sentence()&#xff1a; ② decode()&#xff1a; 代码运行流程 ③ padding()&#xff1a; 代码…

八大排序——c++版

本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…

mlir-tblgen 的应用渐进式示例

示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…

Go语言从零构建SQL数据库(5)-Pratt解析算法:SQL表达式解析的核心引擎

Pratt解析算法&#xff1a;SQL表达式解析的核心引擎 1. 算法概述与工作原理 Pratt解析算法&#xff08;自顶向下运算符优先级解析&#xff09;是一种优雅的表达式解析方法&#xff0c;特别适合处理具有不同优先级运算符的复杂表达式。在我们的SQL解析器中&#xff0c;它负责解…

spring-ai-openai调用Xinference1.4.1报错

1、Xinference 报错logs 此处是调用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …

刻意练习:如何从新手到大师

1. 练习方式 练习主要有两类&#xff1a;天真的练习和刻意练习。 所谓“天真的练习”&#xff0c;基本上只是反复地做某些事情&#xff0c;并指望只靠那种反复&#xff0c;就能提高表现和水平。一旦某个人的表现达到了“可接受”的水平&#xff0c;并且可以做到自动化&#x…

基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)

基于Java的人脸识别在线考试系统(jspspringbootmysql8.x) 在线考试系统提供全面的考试管理和用户管理功能。登录界面支持管理员、教师和学生三种身份验证&#xff0c;确保不同用户访问相应的功能模块。系统自动组卷功能允许管理员根据不同科目和题型&#xff0c;如单选题、多选…