P2386 放苹果
记录163#includebits/stdc.h // 引入万能头文件包含所有常用的标准库 using namespace std; // 使用标准命名空间 int t,m,n; // 定义全局变量t(测试数据组数)、m(苹果数)、n(盘子数) int ans; // 定义全局变量ans用来记录当前测试数据的合法方案总数 // remain_apple: 当前还剩下多少个苹果没放 // remain_plate: 当前还剩下多少个盘子没放 // min_apple: 当前这个盘子至少要放多少个苹果保证非递减避免重复 void dfs(int remain_apple,int remain_plate,int min_apple){ // 如果只剩下最后1个盘子剩下的苹果全部放进去这算作一种合法方案 if(remain_plate1){ ans; // 方案数加1 return; // 结束当前递归分支 } // 枚举当前盘子放多少个苹果从min_apple开始枚举 // 剪枝因为后面还有remain_plate-1个盘子且每个至少放i个 // 所以当前最多只能放 remain_apple / remain_plate 个 for(int imin_apple;iremain_apple/remain_plate;i){ dfs(remain_apple-i,remain_plate-1,i); // 递归搜索下一个盘子传入减去i后的剩余苹果盘子数减1最小可选值更新为i } } int main(){ // 主函数入口 ios::sync_with_stdio(false); // 关闭cin与stdio的同步加快输入输出速度 cin.tie(0); // 解除cin与cout的绑定进一步加快IO效率 cint; // 输入测试数据的组数t while(t--){ // 循环t次处理每一组测试数据 cinmn; // 输入当前组的苹果数m和盘子数n ans0; // 每次测试数据开始前将方案数清零 dfs(m,n,0); // 调用dfs开始搜索初始剩余m个苹果需放n个盘子最小从0开始选允许空盘 coutans\n; // 输出当前测试数据的合法方案总数 } return 0; // 主函数正常结束返回0 }题目传送门https://www.luogu.com.cn/problem/P2386前言我是一名专注信奥赛GESP、CSP-J/S的教练。如果你觉得这篇题解对你有帮助欢迎点击关注我的CSDN账号我会持续更新高质量算法解析。我深知算法思维的构建远比单纯通过题目更重要本系列题解不局限于AC代码的堆砌而是致力于拆解题目背后的逻辑链条与核心知识点备赛路上若遇瓶颈欢迎随时评论或私信我将甄选典型疑难问题通过视频讲解或撰写专项文章的形式为你提供深度答疑。核心解题思路这道题是一道非常经典的组合数学与深度优先搜索DFS剪枝问题。问题转化非递减序列模型题目要求将 mm 个相同的苹果放入 n 个相同的盘子且允许空盘。因为盘子是相同的所以 (5,1,1) 和 (1,1,5) 被视为同一种方案。为了避免重复计数我们可以强制规定每个盘子放的苹果数量呈非递减顺序即前一个盘子放的苹果数 ≤≤ 后一个盘子放的苹果数。这样每一种合法的分配方案都唯一对应一个非递减序列。算法设计DFS 与剪枝优化我们可以使用 DFS 逐个盘子进行分配。在搜索过程中需要维护三个状态剩余苹果数、剩余盘子数、以及当前盘子至少需要放的苹果数即上一个盘子放的苹果数保证非递减。边界条件当剩余盘子数为 1 时说明前面的盘子都已经分配完毕剩下的苹果必须全部放入最后一个盘子。由于是非递减序列只要前面的分配合法最后一步必然合法直接方案数加 1 并返回。枚举与剪枝对于当前盘子枚举放入的苹果数 i 。下界是min_apple上界则是通过平均值剪枝得出的为了保证剩下的盘子也能满足非递减条件当前盘子最多只能放remain_apple / remain_plate个苹果。这极大地减少了搜索树的规模。代码分块详细解释1. 全局变量与函数签名定义#includebits/stdc.h using namespace std; int t, m, n; // 定义全局变量t(测试数据组数)、m(苹果数)、n(盘子数) int ans; // 定义全局变量ans用来记录当前测试数据的合法方案总数 // remain_apple: 当前还剩下多少个苹果没放 // remain_plate: 当前还剩下多少个盘子没放 // min_apple: 当前这个盘子至少要放多少个苹果保证非递减避免重复 void dfs(int remain_apple, int remain_plate, int min_apple){详细分析定义了三个全局变量用于主循环控制。dfs函数是核心搜索函数参数设计非常精妙min_apple参数完美地解决了“盘子相同导致方案重复”的问题它充当了当前枚举的下界强制后续的分配不会小于之前的分配。2. 核心逻辑边界处理与剪枝枚举// 如果只剩下最后1个盘子剩下的苹果全部放进去这算作一种合法方案 if(remain_plate 1){ ans; // 方案数加1 return; // 结束当前递归分支 } // 枚举当前盘子放多少个苹果从min_apple开始枚举 // 剪枝因为后面还有remain_plate-1个盘子且每个至少放i个 // 所以当前最多只能放 remain_apple / remain_plate 个 for(int i min_apple; i remain_apple / remain_plate; i){ dfs(remain_apple - i, remain_plate - 1, i); // 递归搜索下一个盘子 } }详细分析边界处理当remain_plate 1时意味着只剩下一个盘子此时无论剩下多少苹果都只能全放进去。由于我们一直在维护非递减序列只要前面的分配合法最后一步必然合法因此直接ans并返回。循环与剪枝for循环的下界是min_apple保证了非递减上界是remain_apple / remain_plate这是极其关键的平均值剪枝。假设还剩 10 个苹果和 4 个盘子当前盘子最多只能放 10/4210/42 个因为如果放 3 个剩下的 7 个苹果分给 3 个盘子平均值大于 2必然违反非递减规则。这个剪枝将时间复杂度大幅降低。3. 主函数多组数据测试与状态重置int main(){ ios::sync_with_stdio(false); cin.tie(0); cin t; while(t--){ cin m n; ans 0; // 每次测试数据开始前将方案数清零 dfs(m, n, 0); // 调用dfs开始搜索初始剩余m个苹果需放n个盘子最小从0开始选允许空盘 cout ans \n; } return 0; }详细分析主函数处理多组测试数据。每次调用dfs前必须将全局变量ans重置为 0。初始调用时min_apple传入 0完美契合了题目中“允许有的盘子空着不放”的条件。核心逻辑总结代码模块核心变量/操作精炼作用解决的痛点非递减约束min_apple参数传递记录上一个盘子放的苹果数作为当前枚举下界完美解决了“盘子相同导致 (5,1,1) 和 (1,1,5) 重复计数”的痛点边界快速返回if(remain_plate 1)仅剩一个盘子时直接累加方案数避免了无意义的深层递归提升了搜索效率平均值剪枝i remain_apple / remain_plate限制当前盘子能放苹果的最大值极大地缩减了搜索树的规模防止超时状态重置ans 0每组测试数据开始前清零计数器保证多组测试数据之间的独立性防止答案污染允许空盘初始调用dfs(m, n, 0)将初始最小苹果数设为 0满足了题目中“允许有的盘子空着不放”的特殊要求

相关新闻

Windows Subsystem for Android开发指南:在Windows 11上无缝运行安卓应用

Windows Subsystem for Android开发指南:在Windows 11上无缝运行安卓应用

Windows Subsystem for Android开发指南:在Windows 11上无缝运行安卓应用 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA Windows Subsystem for…

2026/10/12 4:45:03 阅读更多 →
一年前他想要AI当CEO,今天他说“我错了“

一年前他想要AI当CEO,今天他说“我错了“

2024年11月,在一档热门播客节目里,萨姆奥尔特曼说过一句在当时看来并不奇怪的话。他说,如果有其他公司抢在OpenAI前面用AI模型取代了CEO,那对OpenAI而言就是一种失败。"如果OpenAI不是第一家由AI CEO管理的大公司&#xff0c…

2026/10/10 11:46:10 阅读更多 →
S32G2汽车网关开发实战:从核心原理到多核通信与性能优化

S32G2汽车网关开发实战:从核心原理到多核通信与性能优化

1. 项目概述:为什么S32G2是汽车网关与域控制器的“硬通货”如果你最近在关注汽车电子,尤其是智能座舱、自动驾驶或者整车电子电气架构的演进,那么NXP的S32G2这个名字你一定不会陌生。它早已不是一颗简单的车规级处理器,而是成为了…

2026/10/14 8:48:53 阅读更多 →

最新新闻

Spring MVC请求转发与重定向详解及实践

Spring MVC请求转发与重定向详解及实践

1. 请求转发与重定向的本质区别1.1 工作流程对比请求转发(Forward)和重定向(Redirect)在Spring MVC中代表着两种完全不同的跳转机制。请求转发发生在服务器内部,整个过程对客户端透明。当我们在Controller中返回"…

2026/10/14 15:07:45 阅读更多 →
插件加载失败排查方法论:从报错到底层机制

插件加载失败排查方法论:从报错到底层机制

同样一条插件的报错,凭什么有人十分钟定位问题,有人能折腾一下午?差别不在天赋,而在有没有把插件机制的底层逻辑吃透。这篇文章想聊的,就是我从一堆failed to load plugins这类报错里爬出来之后,总结出的一…

2026/10/14 15:07:45 阅读更多 →
Qwen-Image-2.1本地部署与API服务发布实战指南

Qwen-Image-2.1本地部署与API服务发布实战指南

前阵子我把 Qwen-Image-2.1 拉到了本地,不光跑通了文生图,还把它封装成了一个 HTTP API 服务,丢给团队内部调用。说实话,整个过程没有想象中那么顺畅,中间也踩了不少坑,但最后的结果让我觉得这条路完全值得…

2026/10/14 15:07:45 阅读更多 →
意图识别项目实战:从TF-IDF到BERT的选型与调参

意图识别项目实战:从TF-IDF到BERT的选型与调参

简介:这套资源是一条龙式的意图识别实现方案,既包含传统的支持向量机与逻辑回归路线,也覆盖基于循环神经网络、注意力机制和预训练模型的深度学习方法,适合毕业设计和课程实践。数据集方面,内置ATIS与SNIPS两个英文公开…

2026/10/14 15:07:45 阅读更多 →
openrig 环境脚手架:Node.js、Claude Code、Codex 与 tmux 实战配置指南

openrig 环境脚手架:Node.js、Claude Code、Codex 与 tmux 实战配置指南

1. openrig 到底想解决什么问题第一次看到openrig这个名字,我下意识把它拆成了 "open" "rig" 两部分。rig 在工程语境里通常指"装配好的成套设备",比如一台调试好的工作站、一套跑通的工具链。把这两个词拼在一起&#x…

2026/10/14 15:07:45 阅读更多 →
MADDPG多智能体强化学习Keras实现与协同训练原理

MADDPG多智能体强化学习Keras实现与协同训练原理

简介:本资源是基于Keras框架实现的多智能体强化学习算法MADDPG(Multi-Agent Deep Deterministic Policy Gradient)完整代码工程,面向深度学习与强化学习进阶学习者、多智能体系统研究者及机器人协同控制实践者。项目解决了多智能体…

2026/10/14 15:06:43 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →